"Doug Gregor" <[EMAIL PROTECTED]> writes: > +#undef TREE_CODE > +/* We redefine TREE_CODE here to omit the explicit case to "enum > + tree_code", which has the side-effect of silencing the "case value > + NNN not in enumerated type" warnings. */ > +#define TREE_CODE(NODE) ((NODE)->base.code) > + > +/* Extracts an extended tree code from a node. */ > +#define LANG_TREE_CODE(NODE) \ > + (TREE_CODE (NODE) == LANG_TYPE? \ > + (enum cplus_tree_code)(LANG_TYPE_SUBCODE (NODE) + MAX_TREE_CODES) \ > + : (enum cplus_tree_code)(TREE_CODE (NODE))) > + > +/* Access the SUBCODE of a LANG_TYPE node. */ > +#define LANG_TYPE_SUBCODE(NODE) (TYPE_LANG_SPECIFIC (NODE)->u.h.subcode) > + > /* Language-specific tree checkers. */ > > #define VAR_OR_FUNCTION_DECL_CHECK(NODE) \ > @@ -176,7 +191,7 @@ struct diagnostic_context; > TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL) > > #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \ > - TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM) > + LANG_TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM) > > #if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007) > #define NON_THUNK_FUNCTION_CHECK(NODE) __extension__ \ > @@ -192,10 +207,41 @@ struct diagnostic_context; > || !__t->decl_common.lang_specific->decl_flags.thunk_p) \ > tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \ > __t; }) > +#define LANG_TREE_CHECK(T,CODE) __extension__ \ > +({ const tree __x = (T); \ > + if (LANG_TREE_CODE ((T)) != (CODE)) \ > + tree_check_failed (__x, __FILE__, __LINE__, __FUNCTION__, \ > + (CODE), 0); \ > + __x; }) > +#define LANG_TREE_CHECK3(T, CODE1, CODE2, CODE3) __extension__ \ > +({ const tree __y = (T); \ > + const enum cplus_tree_code __code = LANG_TREE_CODE (__y); \ > + if (__code != (CODE1) \ > + && __code != (CODE2) \ > + && __code != (CODE3)) \ > + tree_check_failed (__y, __FILE__, __LINE__, __FUNCTION__, \ > + (CODE(CODE2), (CODE3), 0); \ > + __y; }) > #else > #define NON_THUNK_FUNCTION_CHECK(NODE) (NODE) > #define THUNK_FUNCTION_CHECK(NODE) (NODE) > +#define LANG_TREE_CHECK(T,CODE) (T) > +#define LANG_TREE_CHECK3(T, CODE1, CODE2, CODE3) (T) > #endif
Would it make a --enable-checking build faster if you did this: #define LANG_TREE_CHECK(T,CODE) __extension__ \ ({ const tree __x = (T); \ if (TREE_CODE (__x) != LANG_TYPE \ || LANG_TYPE_SUBCODE (__x) != (CODE) - MAX_TREE_CODES) \ tree_check_failed (__x, __FILE__, __LINE__, __FUNCTION__, \ (CODE), 0); \ __x; }) and similar for LANG_TREE_CHECK3. Ian