diff --git a/gcc/tree-core.h b/gcc/tree-core.h index acd8deea34e..fd2be57b78c 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -2285,19 +2285,27 @@ struct floatn_type_info { extern bool tree_contains_struct[MAX_TREE_CODES][64]; /* Class of tree given its code. */ -#if __cpp_inline_variables >= 201606L #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, #define END_OF_BASE_TREE_CODES tcc_exceptional, +#if __cpp_inline_variables < 201606L +template +struct tree_code_type_tmpl { + static constexpr enum tree_code_class tree_code_type[] = { +#include "all-tree.def" + }; +}; + +template +constexpr enum tree_code_class tree_code_type_tmpl::tree_code_type[]; +#else constexpr inline enum tree_code_class tree_code_type[] = { #include "all-tree.def" }; +#endif #undef DEFTREECODE #undef END_OF_BASE_TREE_CODES -#else -extern const enum tree_code_class tree_code_type[]; -#endif /* Each tree code class has an associated string representation. These must correspond to the tree_code_class entries. */ @@ -2305,18 +2313,27 @@ extern const char *const tree_code_class_strings[]; /* Number of argument-words in each kind of tree-node. */ -#if __cpp_inline_variables >= 201606L #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, #define END_OF_BASE_TREE_CODES 0, + +#if __cpp_inline_variables < 201606L +template +struct tree_code_length_tmpl { + static constexpr unsigned char tree_code_length[] = { +#include "all-tree.def" + }; +}; + +template +constexpr unsigned char tree_code_length_tmpl::tree_code_length[]; +#else constexpr inline unsigned char tree_code_length[] = { #include "all-tree.def" }; +#endif #undef DEFTREECODE #undef END_OF_BASE_TREE_CODES -#else -extern const unsigned char tree_code_length[]; -#endif /* Vector of all alias pairs for global symbols. */ extern GTY(()) vec *alias_pairs; diff --git a/gcc/tree.cc b/gcc/tree.cc index 41ccbf3b3cb..d17106e99a8 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -74,34 +74,6 @@ along with GCC; see the file COPYING3. If not see #include "asan.h" #include "ubsan.h" -#if __cpp_inline_variables < 201606L -/* Tree code classes. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, -#define END_OF_BASE_TREE_CODES tcc_exceptional, - -const enum tree_code_class tree_code_type[] = { -#include "all-tree.def" -}; - -#undef DEFTREECODE -#undef END_OF_BASE_TREE_CODES - -/* Table indexed by tree code giving number of expression - operands beyond the fixed part of the node structure. - Not used for types or decls. */ - -#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, -#define END_OF_BASE_TREE_CODES 0, - -const unsigned char tree_code_length[] = { -#include "all-tree.def" -}; - -#undef DEFTREECODE -#undef END_OF_BASE_TREE_CODES -#endif - /* Names of tree components. Used for printing out the tree and error messages. */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, diff --git a/gcc/tree.h b/gcc/tree.h index 92ac0e6a214..91375f9652f 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -177,7 +177,12 @@ code_helper::is_builtin_fn () const #define TREE_CODE_CLASS_STRING(CLASS)\ tree_code_class_strings[(int) (CLASS)] +#if __cpp_inline_variables < 201606L +#define TREE_CODE_CLASS(CODE) \ + tree_code_type_tmpl <0>::tree_code_type[(int) (CODE)] +#else #define TREE_CODE_CLASS(CODE) tree_code_type[(int) (CODE)] +#endif /* Nonzero if NODE represents an exceptional code. */ @@ -271,7 +276,12 @@ code_helper::is_builtin_fn () const #define EXPR_P(NODE) IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) +#if __cpp_inline_variables < 201606L +#define TREE_CODE_LENGTH(CODE) \ + tree_code_length_tmpl <0>::tree_code_length[(int) (CODE)] +#else #define TREE_CODE_LENGTH(CODE) tree_code_length[(int) (CODE)] +#endif /* Helper macros for math builtins. */