summaryrefslogtreecommitdiff
path: root/gcc/cppmacro.c
diff options
context:
space:
mode:
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2000-12-03 12:06:23 +0000
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>2000-12-03 12:06:23 +0000
commit184d60fe97a0eb3733a4ed95be847a0d8c177222 (patch)
tree859e06921d833c83e0f3252c95f0749efd56bcff /gcc/cppmacro.c
parent14ad0a6e78e07a5c683df62781f2efc241bd7185 (diff)
downloadgcc-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.c27
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