"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