]> gcc.gnu.org Git - gcc.git/commitdiff
cppmacro.c (funlike_invocation_p): Re-disable macros enabled by contexts drops AFTER...
authorNeil Booth <neilb@earthling.net>
Sun, 3 Dec 2000 12:06:23 +0000 (12:06 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sun, 3 Dec 2000 12:06:23 +0000 (12:06 +0000)
        * cppmacro.c (funlike_invocation_p): Re-disable macros enabled
        by contexts drops AFTER argument pre-expansion, so that they
        remain enabled during argument pre-expansion.
        (_cpp_pop_context): Unconditionally re-enable a macro when
        dropping a context level.

From-SVN: r37971

gcc/ChangeLog
gcc/cppmacro.c

index 9515f931c676fe558de5110a7ece7dadb5d0201f..fa79157520350c66b9c728dec9f85faf217a8dfc 100644 (file)
@@ -1,3 +1,11 @@
+2000-12-03  Neil Booth  <neilb@earthling.net>
+
+        * cppmacro.c (funlike_invocation_p): Re-disable macros enabled
+        by contexts drops AFTER argument pre-expansion, so that they
+        remain enabled during argument pre-expansion.
+        (_cpp_pop_context): Unconditionally re-enable a macro when
+        dropping a context level.
+
 2000-12-03  Manfred Hollstein  <manfredh@redhat.com>
 
        * arm/t-linux (MULTILIB_OPTIONS): Comment.
index eed2798fc7b22953f28670a3361437097fba4528..0afb9d08c2a27f4a77ee6a1800e73753f8d63288 100644 (file)
@@ -606,7 +606,7 @@ funlike_invocation_p (pfile, node, list)
      const cpp_hashnode *node;
      struct toklist *list;
 {
-  cpp_context *orig_context;
+  cpp_context *orig, *final;
   cpp_token maybe_paren;
   macro_arg *args = 0;
   cpp_lexer_pos macro_pos;
@@ -614,7 +614,7 @@ funlike_invocation_p (pfile, node, list)
   macro_pos = pfile->lexer_pos;
   pfile->state.parsing_args = 1;
   pfile->state.prevent_expansion++;
-  orig_context = pfile->context;
+  orig = pfile->context;
 
   cpp_start_lookahead (pfile);
   cpp_get_token (pfile, &maybe_paren);
@@ -628,7 +628,8 @@ funlike_invocation_p (pfile, node, list)
                 node->name);
 
   /* Restore original context.  */
-  pfile->context = orig_context;
+  final = pfile->context;
+  pfile->context = orig;
   pfile->state.prevent_expansion--;
   pfile->state.parsing_args = 0;
 
@@ -648,6 +649,13 @@ funlike_invocation_p (pfile, node, list)
       free (args);
     }
 
+  /* Re-disable macros *after* pre-expansion.  */
+  while (final != orig)
+    {
+      final = final->next;
+      final->macro->disabled = 1;
+    }
+
   return args != 0;
 }
 
@@ -885,13 +893,12 @@ _cpp_pop_context (pfile)
   cpp_context *context = pfile->context;
 
   pfile->context = context->prev;
-  /* Re-enable a macro and free resources when leaving its expansion.  */
-  if (!pfile->state.parsing_args)
-    {
-      if (!pfile->context->prev)
-       unlock_pools (pfile);
-      context->macro->disabled = 0;
-    }
+  if (!pfile->context->prev && !pfile->state.parsing_args)
+    unlock_pools (pfile);
+
+  /* Re-enable a macro, temporarily if parsing_args, when leaving its
+     expansion.  */
+  context->macro->disabled = 0;
 }
 
 /* Eternal routine to get a token.  Also used nearly everywhere
This page took 0.09286 seconds and 5 git commands to generate.