diff options
author | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-12-03 12:06:23 +0000 |
---|---|---|
committer | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-12-03 12:06:23 +0000 |
commit | 184d60fe97a0eb3733a4ed95be847a0d8c177222 (patch) | |
tree | 859e06921d833c83e0f3252c95f0749efd56bcff /gcc/cppmacro.c | |
parent | 14ad0a6e78e07a5c683df62781f2efc241bd7185 (diff) | |
download | gcc-184d60fe97a0eb3733a4ed95be847a0d8c177222.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37971 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cppmacro.c')
-rw-r--r-- | gcc/cppmacro.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index eed2798fc7b..0afb9d08c2a 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 |