From: Neil Booth Date: Sun, 3 Dec 2000 12:06:23 +0000 (+0000) Subject: cppmacro.c (funlike_invocation_p): Re-disable macros enabled by contexts drops AFTER... X-Git-Tag: prereleases/libstdc++-2.92~2517 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=8aaef6e0c9109dd291029f543042900660fae287;p=gcc.git cppmacro.c (funlike_invocation_p): Re-disable macros enabled by contexts drops AFTER argument pre-expansion... * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9515f931c676..fa7915752035 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2000-12-03 Neil Booth + + * 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 * arm/t-linux (MULTILIB_OPTIONS): Comment. diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index eed2798fc7b2..0afb9d08c2a2 100644 --- a/gcc/cppmacro.c +++ b/gcc/cppmacro.c @@ -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