Message ID | 20240228192843.188979-20-kmatsui@gcc.gnu.org |
---|---|
State | New |
Headers | show |
Series | Optimize more type traits | expand |
On 2/28/24 11:26, Ken Matsui wrote: > This patch implements built-in trait for std::decay. OK. > gcc/cp/ChangeLog: > > * cp-trait.def: Define __decay. > * semantics.cc (finish_trait_type): Handle CPTK_DECAY. > > gcc/testsuite/ChangeLog: > > * g++.dg/ext/has-builtin-1.C: Test existence of __decay. > * g++.dg/ext/decay.C: New test. > > Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org> > --- > gcc/cp/cp-trait.def | 1 + > gcc/cp/semantics.cc | 12 ++++++++++++ > gcc/testsuite/g++.dg/ext/decay.C | 22 ++++++++++++++++++++++ > gcc/testsuite/g++.dg/ext/has-builtin-1.C | 3 +++ > 4 files changed, 38 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/ext/decay.C > > diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def > index 173818adf79..2d1cb7c227c 100644 > --- a/gcc/cp/cp-trait.def > +++ b/gcc/cp/cp-trait.def > @@ -51,6 +51,7 @@ > DEFTRAIT_TYPE (ADD_LVALUE_REFERENCE, "__add_lvalue_reference", 1) > DEFTRAIT_TYPE (ADD_POINTER, "__add_pointer", 1) > DEFTRAIT_TYPE (ADD_RVALUE_REFERENCE, "__add_rvalue_reference", 1) > +DEFTRAIT_TYPE (DECAY, "__decay", 1) > DEFTRAIT_EXPR (HAS_NOTHROW_ASSIGN, "__has_nothrow_assign", 1) > DEFTRAIT_EXPR (HAS_NOTHROW_CONSTRUCTOR, "__has_nothrow_constructor", 1) > DEFTRAIT_EXPR (HAS_NOTHROW_COPY, "__has_nothrow_copy", 1) > diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc > index 19d6f87a9ea..45dc509855a 100644 > --- a/gcc/cp/semantics.cc > +++ b/gcc/cp/semantics.cc > @@ -12801,6 +12801,18 @@ finish_trait_type (cp_trait_kind kind, tree type1, tree type2, > return type1; > return cp_build_reference_type (type1, /*rval=*/true); > > + case CPTK_DECAY: > + if (TYPE_REF_P (type1)) > + type1 = TREE_TYPE (type1); > + > + if (TREE_CODE (type1) == ARRAY_TYPE) > + return finish_trait_type (CPTK_ADD_POINTER, TREE_TYPE (type1), type2, > + complain); > + else if (TREE_CODE (type1) == FUNCTION_TYPE) > + return finish_trait_type (CPTK_ADD_POINTER, type1, type2, complain); > + else > + return cv_unqualified (type1); > + > case CPTK_REMOVE_ALL_EXTENTS: > return strip_array_types (type1); > > diff --git a/gcc/testsuite/g++.dg/ext/decay.C b/gcc/testsuite/g++.dg/ext/decay.C > new file mode 100644 > index 00000000000..8adedfeefe6 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ext/decay.C > @@ -0,0 +1,22 @@ > +// { dg-do compile { target c++11 } } > + > +#define SA(X) static_assert((X),#X) > + > +// Positive tests. > +using test1_type = __decay(bool); > +SA(__is_same(test1_type, bool)); > + > +// NB: DR 705. > +using test2_type = __decay(const int); > +SA(__is_same(test2_type, int)); > + > +using test3_type = __decay(int[4]); > +SA(__is_same(test3_type, __remove_extent(int[4])*)); > + > +using fn_type = void (); > +using test4_type = __decay(fn_type); > +SA(__is_same(test4_type, __add_pointer(fn_type))); > + > +using cfn_type = void () const; > +using test5_type = __decay(cfn_type); > +SA(__is_same(test5_type, cfn_type)); > diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > index c2503c5d82b..3aca273aad6 100644 > --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C > +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > @@ -11,6 +11,9 @@ > #if !__has_builtin (__add_rvalue_reference) > # error "__has_builtin (__add_rvalue_reference) failed" > #endif > +#if !__has_builtin (__decay) > +# error "__has_builtin (__decay) failed" > +#endif > #if !__has_builtin (__builtin_addressof) > # error "__has_builtin (__builtin_addressof) failed" > #endif
diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def index 173818adf79..2d1cb7c227c 100644 --- a/gcc/cp/cp-trait.def +++ b/gcc/cp/cp-trait.def @@ -51,6 +51,7 @@ DEFTRAIT_TYPE (ADD_LVALUE_REFERENCE, "__add_lvalue_reference", 1) DEFTRAIT_TYPE (ADD_POINTER, "__add_pointer", 1) DEFTRAIT_TYPE (ADD_RVALUE_REFERENCE, "__add_rvalue_reference", 1) +DEFTRAIT_TYPE (DECAY, "__decay", 1) DEFTRAIT_EXPR (HAS_NOTHROW_ASSIGN, "__has_nothrow_assign", 1) DEFTRAIT_EXPR (HAS_NOTHROW_CONSTRUCTOR, "__has_nothrow_constructor", 1) DEFTRAIT_EXPR (HAS_NOTHROW_COPY, "__has_nothrow_copy", 1) diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 19d6f87a9ea..45dc509855a 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -12801,6 +12801,18 @@ finish_trait_type (cp_trait_kind kind, tree type1, tree type2, return type1; return cp_build_reference_type (type1, /*rval=*/true); + case CPTK_DECAY: + if (TYPE_REF_P (type1)) + type1 = TREE_TYPE (type1); + + if (TREE_CODE (type1) == ARRAY_TYPE) + return finish_trait_type (CPTK_ADD_POINTER, TREE_TYPE (type1), type2, + complain); + else if (TREE_CODE (type1) == FUNCTION_TYPE) + return finish_trait_type (CPTK_ADD_POINTER, type1, type2, complain); + else + return cv_unqualified (type1); + case CPTK_REMOVE_ALL_EXTENTS: return strip_array_types (type1); diff --git a/gcc/testsuite/g++.dg/ext/decay.C b/gcc/testsuite/g++.dg/ext/decay.C new file mode 100644 index 00000000000..8adedfeefe6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/decay.C @@ -0,0 +1,22 @@ +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert((X),#X) + +// Positive tests. +using test1_type = __decay(bool); +SA(__is_same(test1_type, bool)); + +// NB: DR 705. +using test2_type = __decay(const int); +SA(__is_same(test2_type, int)); + +using test3_type = __decay(int[4]); +SA(__is_same(test3_type, __remove_extent(int[4])*)); + +using fn_type = void (); +using test4_type = __decay(fn_type); +SA(__is_same(test4_type, __add_pointer(fn_type))); + +using cfn_type = void () const; +using test5_type = __decay(cfn_type); +SA(__is_same(test5_type, cfn_type)); diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C index c2503c5d82b..3aca273aad6 100644 --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C @@ -11,6 +11,9 @@ #if !__has_builtin (__add_rvalue_reference) # error "__has_builtin (__add_rvalue_reference) failed" #endif +#if !__has_builtin (__decay) +# error "__has_builtin (__decay) failed" +#endif #if !__has_builtin (__builtin_addressof) # error "__has_builtin (__builtin_addressof) failed" #endif
This patch implements built-in trait for std::decay. gcc/cp/ChangeLog: * cp-trait.def: Define __decay. * semantics.cc (finish_trait_type): Handle CPTK_DECAY. gcc/testsuite/ChangeLog: * g++.dg/ext/has-builtin-1.C: Test existence of __decay. * g++.dg/ext/decay.C: New test. Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org> --- gcc/cp/cp-trait.def | 1 + gcc/cp/semantics.cc | 12 ++++++++++++ gcc/testsuite/g++.dg/ext/decay.C | 22 ++++++++++++++++++++++ gcc/testsuite/g++.dg/ext/has-builtin-1.C | 3 +++ 4 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/decay.C