"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

Reply via email to