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
This commit is contained in:
Neil Booth 2000-12-03 12:06:23 +00:00 committed by Neil Booth
parent 94a3d3b9c3
commit 8aaef6e0c9
2 changed files with 25 additions and 10 deletions

View 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.

View 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