aboutsummaryrefslogtreecommitdiff
path: root/libcpp/macro.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-12-14 07:21:49 -0800
committerNathan Sidwell <nathan@acm.org>2020-12-14 07:23:59 -0800
commit62c5ea5228857a910b38df91c2b0fe28f4d1ddc8 (patch)
tree617d39cb5f141236757bee418fbbeab8ea407084 /libcpp/macro.c
parent159b0bd9ce263dfb791eff5133b0ca0207201c84 (diff)
downloadgcc-62c5ea5228857a910b38df91c2b0fe28f4d1ddc8.zip
gcc-62c5ea5228857a910b38df91c2b0fe28f4d1ddc8.tar.gz
gcc-62c5ea5228857a910b38df91c2b0fe28f4d1ddc8.tar.bz2
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.
Diffstat (limited to 'libcpp/macro.c')
-rw-r--r--libcpp/macro.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/libcpp/macro.c b/libcpp/macro.c
index 0575585..cdb1821 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -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;