+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.
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;
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);
node->name);
/* Restore original context. */
- pfile->context = orig_context;
+ final = pfile->context;
+ pfile->context = orig;
pfile->state.prevent_expansion--;
pfile->state.parsing_args = 0;
free (args);
}
+ /* Re-disable macros *after* pre-expansion. */
+ while (final != orig)
+ {
+ final = final->next;
+ final->macro->disabled = 1;
+ }
+
return args != 0;
}
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