diff options
author | Tom Tromey <tromey@redhat.com> | 2007-11-06 15:57:02 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2007-11-06 15:57:02 +0000 |
commit | 38d346765a731bd88dcda419cc2a247485f49507 (patch) | |
tree | 16730e771eacc9991f800037794eaf32f3a28735 | |
parent | 9ae165a0722366ba1ee877d1099d147a506d0135 (diff) | |
download | gcc-38d346765a731bd88dcda419cc2a247485f49507.zip gcc-38d346765a731bd88dcda419cc2a247485f49507.tar.gz gcc-38d346765a731bd88dcda419cc2a247485f49507.tar.bz2 |
PR c++/32256, PR c++/32368:
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.
From-SVN: r129936
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/function.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pragma-system_header3.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pragma-system_header3.h | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pragma-system_header4.C | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pragma-system_header4.h | 2 |
7 files changed, 60 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c8c570..0025efa 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 05bbd64..56abe4d 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 76b42c9..405068c 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 0000000..a9255c9 --- /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 0000000..e16f38f --- /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 0000000..898e108 --- /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 0000000..c3abae0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header4.h @@ -0,0 +1,2 @@ +#pragma GCC system_header +int noreturn() { } |