aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2007-11-06 15:57:02 +0000
committerTom Tromey <tromey@redhat.com>2007-11-06 15:57:02 +0000
commit6ae0e301de3d9f882e7b9c30d4981891e085d48d (patch)
tree16730e771eacc9991f800037794eaf32f3a28735
parent5d554b4f46dafcad5f259e11b17154effe211c06 (diff)
gcc
PR c++/32256, PR c++/32368: * function.c (saved_in_system_header): New global. (push_cfun): Save in_system_header. (pop_cfun): Restore in_system_header. (push_struct_function): Save in_system_header. gcc/testsuite PR c++/32368: * g++.dg/warn/pragma-system_header3.h: New. * g++.dg/warn/pragma-system_header3.C: New. PR c++/32256: * g++.dg/warn/pragma-system_header4.C: New. * g++.dg/warn/pragma-system_header4.h: New. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@129936 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/function.c19
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/g++.dg/warn/pragma-system_header3.C9
-rw-r--r--gcc/testsuite/g++.dg/warn/pragma-system_header3.h7
-rw-r--r--gcc/testsuite/g++.dg/warn/pragma-system_header4.C6
-rw-r--r--gcc/testsuite/g++.dg/warn/pragma-system_header4.h2
7 files changed, 60 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c8c5700e29..0025efaa506 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2007-11-06 Tom Tromey <tromey@redhat.com>
+
+ PR c++/32256, PR c++/32368:
+ * function.c (saved_in_system_header): New global.
+ (push_cfun): Save in_system_header.
+ (pop_cfun): Restore in_system_header.
+ (push_struct_function): Save in_system_header.
+
2007-11-06 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33977
diff --git a/gcc/function.c b/gcc/function.c
index 05bbd64204c..56abe4d8062 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3834,12 +3834,22 @@ DEF_VEC_ALLOC_P(function_p,heap);
static VEC(function_p,heap) *cfun_stack;
+/* We save the value of in_system_header here when pushing the first
+ function on the cfun stack, and we restore it from here when
+ popping the last function. */
+
+static bool saved_in_system_header;
+
/* Push the current cfun onto the stack, and set cfun to new_cfun. */
void
push_cfun (struct function *new_cfun)
{
+ if (cfun == NULL)
+ saved_in_system_header = in_system_header;
VEC_safe_push (function_p, heap, cfun_stack, cfun);
+ if (new_cfun)
+ in_system_header = DECL_IN_SYSTEM_HEADER (new_cfun->decl);
set_cfun (new_cfun);
}
@@ -3848,7 +3858,10 @@ push_cfun (struct function *new_cfun)
void
pop_cfun (void)
{
- set_cfun (VEC_pop (function_p, cfun_stack));
+ struct function *new_cfun = VEC_pop (function_p, cfun_stack);
+ in_system_header = ((new_cfun == NULL) ? saved_in_system_header
+ : DECL_IN_SYSTEM_HEADER (new_cfun->decl));
+ set_cfun (new_cfun);
}
/* Return value of funcdef and increase it. */
@@ -3922,7 +3935,11 @@ allocate_struct_function (tree fndecl)
void
push_struct_function (tree fndecl)
{
+ if (cfun == NULL)
+ saved_in_system_header = in_system_header;
VEC_safe_push (function_p, heap, cfun_stack, cfun);
+ if (fndecl)
+ in_system_header = DECL_IN_SYSTEM_HEADER (fndecl);
allocate_struct_function (fndecl);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 76b42c924ee..405068cd2ad 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2007-11-06 Tom Tromey <tromey@redhat.com>
+
+ PR c++/32368:
+ * g++.dg/warn/pragma-system_header3.h: New.
+ * g++.dg/warn/pragma-system_header3.C: New.
+
+ PR c++/32256:
+ * g++.dg/warn/pragma-system_header4.C: New.
+ * g++.dg/warn/pragma-system_header4.h: New.
+
2007-11-06 Douglas Gregor <doug.gregor@gmail.com>
PR c++/33977
diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header3.C b/gcc/testsuite/g++.dg/warn/pragma-system_header3.C
new file mode 100644
index 00000000000..a9255c9c1c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pragma-system_header3.C
@@ -0,0 +1,9 @@
+// PR c++/32368
+// { dg-options "-Wall -O" }
+
+#include "pragma-system_header3.h"
+
+int main()
+{
+ return f();
+}
diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header3.h b/gcc/testsuite/g++.dg/warn/pragma-system_header3.h
new file mode 100644
index 00000000000..e16f38f8aad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pragma-system_header3.h
@@ -0,0 +1,7 @@
+#pragma GCC system_header
+
+static inline int f()
+{
+ int i;
+ return i;
+}
diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header4.C b/gcc/testsuite/g++.dg/warn/pragma-system_header4.C
new file mode 100644
index 00000000000..898e10801ca
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pragma-system_header4.C
@@ -0,0 +1,6 @@
+// PR c++/32256
+// { dg-options "-Wall" }
+
+#include "pragma-system_header4.h"
+
+void ok() { }
diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header4.h b/gcc/testsuite/g++.dg/warn/pragma-system_header4.h
new file mode 100644
index 00000000000..c3abae0af27
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pragma-system_header4.h
@@ -0,0 +1,2 @@
+#pragma GCC system_header
+int noreturn() { }