aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
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 /gcc/function.c
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c19
1 files changed, 18 insertions, 1 deletions
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);
}