preprocessor: Deferred macro support
For deferred macros we also need a new field on the macro itself, so that the module machinery can determine the macro was imported. Also the documentation for the hashnode's deferred field was incomplete. libcpp/ * include/cpplib.h (struct cpp_macro): Add imported_p field. (struct cpp_hashnode): Tweak deferred field documentation. * macro.c (_cpp_new_macro): Clear new field. (cpp_get_deferred_macro, get_deferred_or_lazy_macro): Assert more.
This commit is contained in:
parent
159b0bd9ce
commit
62c5ea5228
@ -826,7 +826,10 @@ struct GTY(()) cpp_macro {
|
||||
tokens. */
|
||||
unsigned int extra_tokens : 1;
|
||||
|
||||
/* 1 bits spare (32-bit). 33 on 64-bit target. */
|
||||
/* Imported C++20 macro (from a header unit). */
|
||||
unsigned int imported_p : 1;
|
||||
|
||||
/* 0 bits spare (32-bit). 32 on 64-bit target. */
|
||||
|
||||
union cpp_exp_u
|
||||
{
|
||||
@ -921,9 +924,11 @@ struct GTY(()) cpp_hashnode {
|
||||
|
||||
/* 5 bits spare. */
|
||||
|
||||
/* On a 64-bit system there would be 32-bits of padding to the value
|
||||
/* The deferred cookie is applicable to NT_USER_MACRO or NT_VOID.
|
||||
The latter for when a macro had a prevailing undef.
|
||||
On a 64-bit system there would be 32-bits of padding to the value
|
||||
field. So placing the deferred index here is not costly. */
|
||||
unsigned deferred; /* Deferred index, (unless zero). */
|
||||
unsigned deferred; /* Deferred cookie */
|
||||
|
||||
union _cpp_hashnode_value GTY ((desc ("%1.type"))) value;
|
||||
};
|
||||
|
@ -3708,6 +3708,7 @@ _cpp_new_macro (cpp_reader *pfile, cpp_macro_kind kind, void *placement)
|
||||
macro->used = !CPP_OPTION (pfile, warn_unused_macros);
|
||||
macro->count = 0;
|
||||
macro->fun_like = 0;
|
||||
macro->imported_p = false;
|
||||
macro->extra_tokens = 0;
|
||||
/* To suppress some diagnostics. */
|
||||
macro->syshdr = pfile->buffer && pfile->buffer->sysp != 0;
|
||||
@ -3791,6 +3792,8 @@ cpp_macro *
|
||||
cpp_get_deferred_macro (cpp_reader *pfile, cpp_hashnode *node,
|
||||
location_t loc)
|
||||
{
|
||||
gcc_checking_assert (node->type == NT_USER_MACRO);
|
||||
|
||||
node->value.macro = pfile->cb.user_deferred_macro (pfile, loc, node);
|
||||
|
||||
if (!node->value.macro)
|
||||
@ -3807,11 +3810,9 @@ get_deferred_or_lazy_macro (cpp_reader *pfile, cpp_hashnode *node,
|
||||
if (!macro)
|
||||
{
|
||||
macro = cpp_get_deferred_macro (pfile, node, loc);
|
||||
if (!macro)
|
||||
return NULL;
|
||||
gcc_checking_assert (!macro || !macro->lazy);
|
||||
}
|
||||
|
||||
if (macro->lazy)
|
||||
else if (macro->lazy)
|
||||
{
|
||||
pfile->cb.user_lazy_macro (pfile, macro, macro->lazy - 1);
|
||||
macro->lazy = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user