aboutsummaryrefslogtreecommitdiff
path: root/libcpp/directives.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-10-31 18:38:44 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-10-31 18:38:44 +0100
commitaa23e73b1a090659344ff88361135bd947064e30 (patch)
treeab29c66793009b48773fdd1844beac65d7c2a2a1 /libcpp/directives.c
parent0092b21f24a6778a54caac4015db1d0ad6291a45 (diff)
downloadgcc-aa23e73b1a090659344ff88361135bd947064e30.zip
gcc-aa23e73b1a090659344ff88361135bd947064e30.tar.gz
gcc-aa23e73b1a090659344ff88361135bd947064e30.tar.bz2
re PR preprocessor/92296 (internal compiler error: Segmentation fault #pragma push_macro("__LINE__"))
PR preprocessor/92296 * internal.h (struct def_pragma_macro): Add is_builtin bitfield. (_cpp_restore_special_builtin): Declare. * init.c (_cpp_restore_special_builtin): New function. * directives.c (do_pragma_push_macro): For NT_BUILTIN_MACRO set is_builtin and don't try to grab definition. (cpp_pop_definition): Use _cpp_restore_special_builtin to restore builtin macros. * c-c++-common/cpp/pr92296-1.c: New test. * c-c++-common/cpp/pr92296-2.c: New test. From-SVN: r277685
Diffstat (limited to 'libcpp/directives.c')
-rw-r--r--libcpp/directives.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 61f1fef..6e011a1 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -1582,6 +1582,8 @@ do_pragma_push_macro (cpp_reader *pfile)
node = _cpp_lex_identifier (pfile, c->name);
if (node->type == NT_VOID)
c->is_undef = 1;
+ else if (node->type == NT_BUILTIN_MACRO)
+ c->is_builtin = 1;
else
{
defn = cpp_macro_definition (pfile, node);
@@ -2470,6 +2472,11 @@ cpp_pop_definition (cpp_reader *pfile, struct def_pragma_macro *c)
if (c->is_undef)
return;
+ if (c->is_builtin)
+ {
+ _cpp_restore_special_builtin (pfile, c);
+ return;
+ }
{
size_t namelen;