#define CPP_HASHNODE_VALUE_IDX(HNODE) \ ((HNODE.flags & NODE_MACRO_ARG) ? NTV_ARGUMENT \ : HNODE.type == NT_MACRO ? ((HNODE.flags & NODE_BUILTIN) \ ? NTV_BUILTIN : NTV_MACRO) \ : HNODE.type == NT_ASSERTION ? NTV_ANSWER \ : NTV_NONE)
/* The common part of an identifier node shared amongst all 3 C front ends. Also used to store CPP identifiers, which are a superset of identifiers in the grammatical sense. */
union GTY(()) _cpp_hashnode_value { /* If a macro. */ cpp_macro * GTY((tag ("NTV_MACRO"))) macro; /* Answers to an assertion. */ struct answer * GTY ((tag ("NTV_ANSWER"))) answers; /* Code for a builtin macro. */ enum cpp_builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin; /* Macro argument index. */ unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index; };
struct GTY(()) cpp_hashnode { struct ht_identifier ident; unsigned int is_directive : 1; unsigned int directive_index : 7; /* If is_directive, then index into directive table. Otherwise, a NODE_OPERATOR. */ unsigned char rid_code; /* Rid code - for front ends. */ ENUM_BITFIELD(node_type) type : 6; /* CPP node type. */ unsigned int flags : 10; /* CPP flags. */
union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value; };