Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Fri, Jul 14, 2023 at 3:49 AM Jonathan Wakely wrote: > > On Fri, 14 Jul 2023 at 11:48, Jonathan Wakely wrote: > > > > On Thu, 13 Jul 2023 at 21:04, Ken Matsui wrote: > > > > > > On Thu, Jul 13, 2023 at 2:22 AM Jonathan Wakely > > > wrote: > > > > > > > > On Wed, 12 Jul 2023 at 21:42, Ken Matsui > > > > wrote: > > > > > > > > > > On Wed, Jul 12, 2023 at 3:01 AM Jonathan Wakely > > > > > wrote: > > > > > > > > > > > > On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ > > > > > > wrote: > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > > > Here is the benchmark result for is_pointer: > > > > > > > > > > > > > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > > > > > > > > > > > > > Time: -62.1344% > > > > > > > Peak Memory Usage: -52.4281% > > > > > > > Total Memory Usage: -53.5889% > > > > > > > > > > > > Wow! > > > > > > > > > > > > Although maybe we could have improved our std::is_pointer_v anyway, > > > > > > like so: > > > > > > > > > > > > template > > > > > > inline constexpr bool is_pointer_v = false; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > > > > > > > > > I'm not sure why I didn't already do that. > > > > > > > > > > > > Could you please benchmark that? And if it is better than the > > > > > > current > > > > > > impl using is_pointer<_Tp>::value then we should do this in the > > > > > > library: > > > > > > > > > > > > #if __has_builtin(__is_pointer) > > > > > > template > > > > > > inline constexpr bool is_pointer_v = __is_pointer(_Tp); > > > > > > #else > > > > > > template > > > > > > inline constexpr bool is_pointer_v = false; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > > > > template > > > > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > > > #endif > > > > > > > > > > Hi François and Jonathan, > > > > > > > > > > Thank you for your reviews! I will rename the four underscores to the > > > > > appropriate name and take a benchmark once I get home. > > > > > > > > > > If I apply your change on is_pointer_v, is it better to add the > > > > > `Co-authored-by:` line in the commit? > > > > > > > > Yes, that would be the correct thing to do (although in this case the > > > > change is small enough that I don't really care about getting credit > > > > for it :-) > > > > > > > Thank you! I will include it in my commit :) I see that you included > > > the DCO sign-off in the MAINTAINERS file. However, if a reviewer > > > doesn't, should I include the `Signed-off-by:` line for the reviewer > > > as well? > > > > No, reviewers should not sign-off, that's for the code author. And > > authors should add that themselves (or clearly state that they agree > > to the DCO terms). You should not sign-off on someone else's behalf. > > You can add Reviewed-by: if you want to record that information. > I see. Thank you!
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Fri, 14 Jul 2023 at 11:48, Jonathan Wakely wrote: > > On Thu, 13 Jul 2023 at 21:04, Ken Matsui wrote: > > > > On Thu, Jul 13, 2023 at 2:22 AM Jonathan Wakely wrote: > > > > > > On Wed, 12 Jul 2023 at 21:42, Ken Matsui > > > wrote: > > > > > > > > On Wed, Jul 12, 2023 at 3:01 AM Jonathan Wakely > > > > wrote: > > > > > > > > > > On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ > > > > > wrote: > > > > > > > > > > > > Hi, > > > > > > > > > > > > Here is the benchmark result for is_pointer: > > > > > > > > > > > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > > > > > > > > > > > Time: -62.1344% > > > > > > Peak Memory Usage: -52.4281% > > > > > > Total Memory Usage: -53.5889% > > > > > > > > > > Wow! > > > > > > > > > > Although maybe we could have improved our std::is_pointer_v anyway, > > > > > like so: > > > > > > > > > > template > > > > > inline constexpr bool is_pointer_v = false; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > > > > > > > I'm not sure why I didn't already do that. > > > > > > > > > > Could you please benchmark that? And if it is better than the current > > > > > impl using is_pointer<_Tp>::value then we should do this in the > > > > > library: > > > > > > > > > > #if __has_builtin(__is_pointer) > > > > > template > > > > > inline constexpr bool is_pointer_v = __is_pointer(_Tp); > > > > > #else > > > > > template > > > > > inline constexpr bool is_pointer_v = false; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > > > template > > > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > > #endif > > > > > > > > Hi François and Jonathan, > > > > > > > > Thank you for your reviews! I will rename the four underscores to the > > > > appropriate name and take a benchmark once I get home. > > > > > > > > If I apply your change on is_pointer_v, is it better to add the > > > > `Co-authored-by:` line in the commit? > > > > > > Yes, that would be the correct thing to do (although in this case the > > > change is small enough that I don't really care about getting credit > > > for it :-) > > > > > Thank you! I will include it in my commit :) I see that you included > > the DCO sign-off in the MAINTAINERS file. However, if a reviewer > > doesn't, should I include the `Signed-off-by:` line for the reviewer > > as well? > > No, reviewers should not sign-off, that's for the code author. And > authors should add that themselves (or clearly state that they agree > to the DCO terms). You should not sign-off on someone else's behalf. You can add Reviewed-by: if you want to record that information.
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Thu, 13 Jul 2023 at 21:04, Ken Matsui wrote: > > On Thu, Jul 13, 2023 at 2:22 AM Jonathan Wakely wrote: > > > > On Wed, 12 Jul 2023 at 21:42, Ken Matsui wrote: > > > > > > On Wed, Jul 12, 2023 at 3:01 AM Jonathan Wakely > > > wrote: > > > > > > > > On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ > > > > wrote: > > > > > > > > > > Hi, > > > > > > > > > > Here is the benchmark result for is_pointer: > > > > > > > > > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > > > > > > > > > Time: -62.1344% > > > > > Peak Memory Usage: -52.4281% > > > > > Total Memory Usage: -53.5889% > > > > > > > > Wow! > > > > > > > > Although maybe we could have improved our std::is_pointer_v anyway, > > > > like so: > > > > > > > > template > > > > inline constexpr bool is_pointer_v = false; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > > > > > I'm not sure why I didn't already do that. > > > > > > > > Could you please benchmark that? And if it is better than the current > > > > impl using is_pointer<_Tp>::value then we should do this in the > > > > library: > > > > > > > > #if __has_builtin(__is_pointer) > > > > template > > > > inline constexpr bool is_pointer_v = __is_pointer(_Tp); > > > > #else > > > > template > > > > inline constexpr bool is_pointer_v = false; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > > template > > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > #endif > > > > > > Hi François and Jonathan, > > > > > > Thank you for your reviews! I will rename the four underscores to the > > > appropriate name and take a benchmark once I get home. > > > > > > If I apply your change on is_pointer_v, is it better to add the > > > `Co-authored-by:` line in the commit? > > > > Yes, that would be the correct thing to do (although in this case the > > change is small enough that I don't really care about getting credit > > for it :-) > > > Thank you! I will include it in my commit :) I see that you included > the DCO sign-off in the MAINTAINERS file. However, if a reviewer > doesn't, should I include the `Signed-off-by:` line for the reviewer > as well? No, reviewers should not sign-off, that's for the code author. And authors should add that themselves (or clearly state that they agree to the DCO terms). You should not sign-off on someone else's behalf.
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Thu, Jul 13, 2023 at 2:22 AM Jonathan Wakely wrote: > > On Wed, 12 Jul 2023 at 21:42, Ken Matsui wrote: > > > > On Wed, Jul 12, 2023 at 3:01 AM Jonathan Wakely wrote: > > > > > > On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ > > > wrote: > > > > > > > > Hi, > > > > > > > > Here is the benchmark result for is_pointer: > > > > > > > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > > > > > > > Time: -62.1344% > > > > Peak Memory Usage: -52.4281% > > > > Total Memory Usage: -53.5889% > > > > > > Wow! > > > > > > Although maybe we could have improved our std::is_pointer_v anyway, like > > > so: > > > > > > template > > > inline constexpr bool is_pointer_v = false; > > > template > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > template > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > template > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > template > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > > > I'm not sure why I didn't already do that. > > > > > > Could you please benchmark that? And if it is better than the current > > > impl using is_pointer<_Tp>::value then we should do this in the > > > library: > > > > > > #if __has_builtin(__is_pointer) > > > template > > > inline constexpr bool is_pointer_v = __is_pointer(_Tp); > > > #else > > > template > > > inline constexpr bool is_pointer_v = false; > > > template > > > inline constexpr bool is_pointer_v<_Tp*> = true; > > > template > > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > > template > > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > > template > > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > #endif > > > > Hi François and Jonathan, > > > > Thank you for your reviews! I will rename the four underscores to the > > appropriate name and take a benchmark once I get home. > > > > If I apply your change on is_pointer_v, is it better to add the > > `Co-authored-by:` line in the commit? > > Yes, that would be the correct thing to do (although in this case the > change is small enough that I don't really care about getting credit > for it :-) > Thank you! I will include it in my commit :) I see that you included the DCO sign-off in the MAINTAINERS file. However, if a reviewer doesn't, should I include the `Signed-off-by:` line for the reviewer as well?
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Wed, 12 Jul 2023 at 21:42, Ken Matsui wrote: > > On Wed, Jul 12, 2023 at 3:01 AM Jonathan Wakely wrote: > > > > On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ > > wrote: > > > > > > Hi, > > > > > > Here is the benchmark result for is_pointer: > > > > > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > > > > > Time: -62.1344% > > > Peak Memory Usage: -52.4281% > > > Total Memory Usage: -53.5889% > > > > Wow! > > > > Although maybe we could have improved our std::is_pointer_v anyway, like so: > > > > template > > inline constexpr bool is_pointer_v = false; > > template > > inline constexpr bool is_pointer_v<_Tp*> = true; > > template > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > template > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > template > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > > > I'm not sure why I didn't already do that. > > > > Could you please benchmark that? And if it is better than the current > > impl using is_pointer<_Tp>::value then we should do this in the > > library: > > > > #if __has_builtin(__is_pointer) > > template > > inline constexpr bool is_pointer_v = __is_pointer(_Tp); > > #else > > template > > inline constexpr bool is_pointer_v = false; > > template > > inline constexpr bool is_pointer_v<_Tp*> = true; > > template > > inline constexpr bool is_pointer_v<_Tp* const> = true; > > template > > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > > template > > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > #endif > > Hi François and Jonathan, > > Thank you for your reviews! I will rename the four underscores to the > appropriate name and take a benchmark once I get home. > > If I apply your change on is_pointer_v, is it better to add the > `Co-authored-by:` line in the commit? Yes, that would be the correct thing to do (although in this case the change is small enough that I don't really care about getting credit for it :-)
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Wed, Jul 12, 2023 at 3:01 AM Jonathan Wakely wrote: > > On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ > wrote: > > > > Hi, > > > > Here is the benchmark result for is_pointer: > > > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > > > Time: -62.1344% > > Peak Memory Usage: -52.4281% > > Total Memory Usage: -53.5889% > > Wow! > > Although maybe we could have improved our std::is_pointer_v anyway, like so: > > template > inline constexpr bool is_pointer_v = false; > template > inline constexpr bool is_pointer_v<_Tp*> = true; > template > inline constexpr bool is_pointer_v<_Tp* const> = true; > template > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > template > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > > I'm not sure why I didn't already do that. > > Could you please benchmark that? And if it is better than the current > impl using is_pointer<_Tp>::value then we should do this in the > library: > > #if __has_builtin(__is_pointer) > template > inline constexpr bool is_pointer_v = __is_pointer(_Tp); > #else > template > inline constexpr bool is_pointer_v = false; > template > inline constexpr bool is_pointer_v<_Tp*> = true; > template > inline constexpr bool is_pointer_v<_Tp* const> = true; > template > inline constexpr bool is_pointer_v<_Tp* volatile> = true; > template > inline constexpr bool is_pointer_v<_Tp* const volatile> = true; > #endif Hi François and Jonathan, Thank you for your reviews! I will rename the four underscores to the appropriate name and take a benchmark once I get home. If I apply your change on is_pointer_v, is it better to add the `Co-authored-by:` line in the commit?
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
On Mon, 10 Jul 2023 at 06:51, Ken Matsui via Libstdc++ wrote: > > Hi, > > Here is the benchmark result for is_pointer: > > https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 > > Time: -62.1344% > Peak Memory Usage: -52.4281% > Total Memory Usage: -53.5889% Wow! Although maybe we could have improved our std::is_pointer_v anyway, like so: template inline constexpr bool is_pointer_v = false; template inline constexpr bool is_pointer_v<_Tp*> = true; template inline constexpr bool is_pointer_v<_Tp* const> = true; template inline constexpr bool is_pointer_v<_Tp* volatile> = true; template inline constexpr bool is_pointer_v<_Tp* const volatile> = true; I'm not sure why I didn't already do that. Could you please benchmark that? And if it is better than the current impl using is_pointer<_Tp>::value then we should do this in the library: #if __has_builtin(__is_pointer) template inline constexpr bool is_pointer_v = __is_pointer(_Tp); #else template inline constexpr bool is_pointer_v = false; template inline constexpr bool is_pointer_v<_Tp*> = true; template inline constexpr bool is_pointer_v<_Tp* const> = true; template inline constexpr bool is_pointer_v<_Tp* volatile> = true; template inline constexpr bool is_pointer_v<_Tp* const volatile> = true; #endif
Re: [PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
Hi, Here is the benchmark result for is_pointer: https://github.com/ken-matsui/gcc-benches/blob/main/is_pointer.md#sun-jul--9-103948-pm-pdt-2023 Time: -62.1344% Peak Memory Usage: -52.4281% Total Memory Usage: -53.5889% Sincerely, Ken Matsui On Sun, Jul 9, 2023 at 10:38 PM Ken Matsui wrote: > > This patch implements built-in trait for std::is_pointer. > > gcc/cp/ChangeLog: > > * cp-trait.def: Define __is_pointer. > * constraint.cc (diagnose_trait_expr): Handle CPTK_IS_POINTER. > * semantics.cc (trait_expr_value): Likewise. > (finish_trait_expr): Likewise. > > gcc/testsuite/ChangeLog: > > * g++.dg/ext/has-builtin-1.C: Test existence of __is_pointer. > * g++.dg/ext/is_pointer.C: New test. > * g++.dg/tm/pr46567.C (__is_pointer): Rename to ... > (is_pointer): ... this. > * g++.dg/torture/20070621-1.C: Likewise. > * g++.dg/torture/pr57107.C: Likewise. > > libstdc++-v3/ChangeLog: > > * include/bits/cpp_type_traits.h (__is_pointer): Rename to ... > (is_pointer): ... this. > * include/bits/deque.tcc: Use is_pointer instead. > * include/bits/stl_algobase.h: Likewise. > > Signed-off-by: Ken Matsui > --- > gcc/cp/constraint.cc| 3 ++ > gcc/cp/cp-trait.def | 1 + > gcc/cp/semantics.cc | 4 ++ > gcc/testsuite/g++.dg/ext/has-builtin-1.C| 3 ++ > gcc/testsuite/g++.dg/ext/is_pointer.C | 51 + > gcc/testsuite/g++.dg/tm/pr46567.C | 22 - > gcc/testsuite/g++.dg/torture/20070621-1.C | 4 +- > gcc/testsuite/g++.dg/torture/pr57107.C | 4 +- > libstdc++-v3/include/bits/cpp_type_traits.h | 6 +-- > libstdc++-v3/include/bits/deque.tcc | 6 +-- > libstdc++-v3/include/bits/stl_algobase.h| 6 +-- > 11 files changed, 86 insertions(+), 24 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/ext/is_pointer.C > > diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc > index 8cf0f2d0974..30266204eb5 100644 > --- a/gcc/cp/constraint.cc > +++ b/gcc/cp/constraint.cc > @@ -3751,6 +3751,9 @@ diagnose_trait_expr (tree expr, tree args) > case CPTK_IS_UNION: >inform (loc, " %qT is not a union", t1); >break; > +case CPTK_IS_POINTER: > + inform (loc, " %qT is not a pointer", t1); > + break; > case CPTK_IS_AGGREGATE: >inform (loc, " %qT is not an aggregate", t1); >break; > diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def > index 8b7fece0cc8..b7c263e9a77 100644 > --- a/gcc/cp/cp-trait.def > +++ b/gcc/cp/cp-trait.def > @@ -82,6 +82,7 @@ DEFTRAIT_EXPR (IS_TRIVIALLY_ASSIGNABLE, > "__is_trivially_assignable", 2) > DEFTRAIT_EXPR (IS_TRIVIALLY_CONSTRUCTIBLE, "__is_trivially_constructible", > -1) > DEFTRAIT_EXPR (IS_TRIVIALLY_COPYABLE, "__is_trivially_copyable", 1) > DEFTRAIT_EXPR (IS_UNION, "__is_union", 1) > +DEFTRAIT_EXPR (IS_POINTER, "__is_pointer", 1) > DEFTRAIT_EXPR (REF_CONSTRUCTS_FROM_TEMPORARY, > "__reference_constructs_from_temporary", 2) > DEFTRAIT_EXPR (REF_CONVERTS_FROM_TEMPORARY, > "__reference_converts_from_temporary", 2) > /* FIXME Added space to avoid direct usage in GCC 13. */ > diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc > index 8fb47fd179e..68f8a4fe85b 100644 > --- a/gcc/cp/semantics.cc > +++ b/gcc/cp/semantics.cc > @@ -12118,6 +12118,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, > tree type2) > case CPTK_IS_UNION: >return type_code1 == UNION_TYPE; > > +case CPTK_IS_POINTER: > + return TYPE_PTR_P (type1); > + > case CPTK_IS_ASSIGNABLE: >return is_xible (MODIFY_EXPR, type1, type2); > > @@ -12296,6 +12299,7 @@ finish_trait_expr (location_t loc, cp_trait_kind > kind, tree type1, tree type2) > case CPTK_IS_ENUM: > case CPTK_IS_UNION: > case CPTK_IS_SAME: > +case CPTK_IS_POINTER: >break; > > case CPTK_IS_LAYOUT_COMPATIBLE: > diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C > b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > index f343e153e56..9dace5cbd48 100644 > --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C > +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > @@ -146,3 +146,6 @@ > #if !__has_builtin (__remove_cvref) > # error "__has_builtin (__remove_cvref) failed" > #endif > +#if !__has_builtin (__is_pointer) > +# error "__has_builtin (__is_pointer) failed" > +#endif > diff --git a/gcc/testsuite/g++.dg/ext/is_pointer.C > b/gcc/testsuite/g++.dg/ext/is_pointer.C > new file mode 100644 > index 000..d6e39565950 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ext/is_pointer.C > @@ -0,0 +1,51 @@ > +// { dg-do compile { target c++11 } } > + > +#define SA(X) static_assert((X),#X) > + > +SA(!__is_pointer(int)); > +SA(__is_pointer(int*)); > +SA(__is_pointer(int**)); > + > +SA(__is_pointer(const int*)); > +SA(__is_pointer(const int**)); > +SA(__is_pointer(int* const)); > +SA(__is_pointer(int**
[PATCH v2 1/2] c++, libstdc++: implement __is_pointer built-in trait
This patch implements built-in trait for std::is_pointer. gcc/cp/ChangeLog: * cp-trait.def: Define __is_pointer. * constraint.cc (diagnose_trait_expr): Handle CPTK_IS_POINTER. * semantics.cc (trait_expr_value): Likewise. (finish_trait_expr): Likewise. gcc/testsuite/ChangeLog: * g++.dg/ext/has-builtin-1.C: Test existence of __is_pointer. * g++.dg/ext/is_pointer.C: New test. * g++.dg/tm/pr46567.C (__is_pointer): Rename to ... (is_pointer): ... this. * g++.dg/torture/20070621-1.C: Likewise. * g++.dg/torture/pr57107.C: Likewise. libstdc++-v3/ChangeLog: * include/bits/cpp_type_traits.h (__is_pointer): Rename to ... (is_pointer): ... this. * include/bits/deque.tcc: Use is_pointer instead. * include/bits/stl_algobase.h: Likewise. Signed-off-by: Ken Matsui --- gcc/cp/constraint.cc| 3 ++ gcc/cp/cp-trait.def | 1 + gcc/cp/semantics.cc | 4 ++ gcc/testsuite/g++.dg/ext/has-builtin-1.C| 3 ++ gcc/testsuite/g++.dg/ext/is_pointer.C | 51 + gcc/testsuite/g++.dg/tm/pr46567.C | 22 - gcc/testsuite/g++.dg/torture/20070621-1.C | 4 +- gcc/testsuite/g++.dg/torture/pr57107.C | 4 +- libstdc++-v3/include/bits/cpp_type_traits.h | 6 +-- libstdc++-v3/include/bits/deque.tcc | 6 +-- libstdc++-v3/include/bits/stl_algobase.h| 6 +-- 11 files changed, 86 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/is_pointer.C diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 8cf0f2d0974..30266204eb5 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -3751,6 +3751,9 @@ diagnose_trait_expr (tree expr, tree args) case CPTK_IS_UNION: inform (loc, " %qT is not a union", t1); break; +case CPTK_IS_POINTER: + inform (loc, " %qT is not a pointer", t1); + break; case CPTK_IS_AGGREGATE: inform (loc, " %qT is not an aggregate", t1); break; diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def index 8b7fece0cc8..b7c263e9a77 100644 --- a/gcc/cp/cp-trait.def +++ b/gcc/cp/cp-trait.def @@ -82,6 +82,7 @@ DEFTRAIT_EXPR (IS_TRIVIALLY_ASSIGNABLE, "__is_trivially_assignable", 2) DEFTRAIT_EXPR (IS_TRIVIALLY_CONSTRUCTIBLE, "__is_trivially_constructible", -1) DEFTRAIT_EXPR (IS_TRIVIALLY_COPYABLE, "__is_trivially_copyable", 1) DEFTRAIT_EXPR (IS_UNION, "__is_union", 1) +DEFTRAIT_EXPR (IS_POINTER, "__is_pointer", 1) DEFTRAIT_EXPR (REF_CONSTRUCTS_FROM_TEMPORARY, "__reference_constructs_from_temporary", 2) DEFTRAIT_EXPR (REF_CONVERTS_FROM_TEMPORARY, "__reference_converts_from_temporary", 2) /* FIXME Added space to avoid direct usage in GCC 13. */ diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 8fb47fd179e..68f8a4fe85b 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -12118,6 +12118,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_UNION: return type_code1 == UNION_TYPE; +case CPTK_IS_POINTER: + return TYPE_PTR_P (type1); + case CPTK_IS_ASSIGNABLE: return is_xible (MODIFY_EXPR, type1, type2); @@ -12296,6 +12299,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_ENUM: case CPTK_IS_UNION: case CPTK_IS_SAME: +case CPTK_IS_POINTER: break; case CPTK_IS_LAYOUT_COMPATIBLE: diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C index f343e153e56..9dace5cbd48 100644 --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C @@ -146,3 +146,6 @@ #if !__has_builtin (__remove_cvref) # error "__has_builtin (__remove_cvref) failed" #endif +#if !__has_builtin (__is_pointer) +# error "__has_builtin (__is_pointer) failed" +#endif diff --git a/gcc/testsuite/g++.dg/ext/is_pointer.C b/gcc/testsuite/g++.dg/ext/is_pointer.C new file mode 100644 index 000..d6e39565950 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_pointer.C @@ -0,0 +1,51 @@ +// { dg-do compile { target c++11 } } + +#define SA(X) static_assert((X),#X) + +SA(!__is_pointer(int)); +SA(__is_pointer(int*)); +SA(__is_pointer(int**)); + +SA(__is_pointer(const int*)); +SA(__is_pointer(const int**)); +SA(__is_pointer(int* const)); +SA(__is_pointer(int** const)); +SA(__is_pointer(int* const* const)); + +SA(__is_pointer(volatile int*)); +SA(__is_pointer(volatile int**)); +SA(__is_pointer(int* volatile)); +SA(__is_pointer(int** volatile)); +SA(__is_pointer(int* volatile* volatile)); + +SA(__is_pointer(const volatile int*)); +SA(__is_pointer(const volatile int**)); +SA(__is_pointer(const int* volatile)); +SA(__is_pointer(volatile int* const)); +SA(__is_pointer(int* const volatile)); +SA(__is_pointer(const int** volatile)); +SA(__is_pointer(volatile int** const)); +SA(__is_pointer(int** const