+2018-08-07 Nathan Sidwell <nathan@acm.org>
+
+ Move NODE_MACRO_ARG to NT_MACRO_ARG.
+ libcpp/
+ * include/libcpp.h (NODE_MACRO_ARG): Delete.
+ (enum node_type): Add NT_MACRO_ARG.
+ (CPP_HSHNODE_VALUE_IDX): Adjust.
+ * macro.c (_cpp_save_parameter, _cpp_unsave_parameter): Adjust.
+ (lex_expansion_token): Likewise.
+ * traditional.c (_cpp_scan_out_logical_line): Likewise.
+
2018-08-06 Nathan Sidwell <nathan@acm.org>
Macro laziness now a property of cpp_macro.
#define NODE_DIAGNOSTIC (1 << 3) /* Possible diagnostic when lexed. */
#define NODE_WARN (1 << 4) /* Warn if redefined or undefined. */
#define NODE_DISABLED (1 << 5) /* A disabled macro. */
-#define NODE_MACRO_ARG (1 << 6) /* Used during #define processing. */
+//#define NODE_MACRO_ARG (1 << 6) /* Used during #define processing. */
#define NODE_USED (1 << 7) /* Dumped with -dU. */
#define NODE_CONDITIONAL (1 << 8) /* Conditional macro */
#define NODE_WARN_OPERATOR (1 << 9) /* Warn about C++ named operator. */
enum node_type
{
NT_VOID = 0, /* No definition yet. */
- NT_MACRO /* A macro or assert. */
+ NT_MACRO_ARG, /* A macro arg. */
+ NT_MACRO, /* A macro or assert. */
+ NT_BUILTIN, /* A builtin macro. */
};
/* Different flavors of builtin macro. _Pragma is an operator, but we
};
#define CPP_HASHNODE_VALUE_IDX(HNODE) \
- ((HNODE).flags & NODE_MACRO_ARG ? NTV_ARGUMENT \
+ ((HNODE).type == NT_MACRO_ARG ? NTV_ARGUMENT \
: (HNODE).flags & NODE_BUILTIN ? NTV_BUILTIN \
: NTV_MACRO)
cpp_hashnode *spelling)
{
/* Constraint 6.10.3.6 - duplicate parameter names. */
- if (node->flags & NODE_MACRO_ARG)
+ if (node->type == NT_MACRO_ARG)
{
cpp_error (pfile, CPP_DL_ERROR, "duplicate macro parameter \"%s\"",
NODE_NAME (node));
((cpp_hashnode **)base)[n++] = spelling;
/* Morph into a macro arg. */
- node->flags |= NODE_MACRO_ARG;
+ node->type = NT_MACRO_ARG;
/* Index is 1 based. */
node->value.arg_index = n;
&((struct macro_arg_saved_data *) pfile->macro_buffer)[n];
struct cpp_hashnode *node = save->canonical_node;
- node->flags &= ~ NODE_MACRO_ARG;
node->value = save->value;
+ node->type = (node->flags & NODE_BUILTIN || node->value.macro
+ ? NT_MACRO : NT_VOID);
}
}
pfile->cur_token = saved_cur_token;
/* Is this a parameter? */
- if (token->type == CPP_NAME
- && (token->val.node.node->flags & NODE_MACRO_ARG) != 0)
+ if (token->type == CPP_NAME && token->val.node.node->type == NT_MACRO_ARG)
{
/* Morph into a parameter reference. */
cpp_hashnode *spelling = token->val.node.spelling;
goto new_context;
}
}
- else if (macro && (node->flags & NODE_MACRO_ARG) != 0)
+ else if (macro && node->type == NT_MACRO_ARG)
{
/* Found a parameter in the replacement text of a
#define. Remove its name from the output. */