Re: [PATCH 1/2] c++, libstdc++: implement __is_pointer built-in trait

2023-07-12 Thread Jonathan Wakely via Gcc-patches
On Mon, 10 Jul 2023 at 06:24, Ken Matsui via Libstdc++
 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.

Please pick another name, is_pointer is not OK for the library trait.

(It might be OK for the g++.dg tests, I have no opinion on that.)

You could use __is_pointer_type or __is_ptr, I don't really mind which
(it's only used in two places).



Re: [PATCH 1/2] c++, libstdc++: implement __is_pointer built-in trait

2023-07-12 Thread Jonathan Wakely via Gcc-patches
On Wed, 12 Jul 2023 at 05:41, François Dumont via Libstdc++
 wrote:
>
>
> On 10/07/2023 07:23, Ken Matsui via Libstdc++ 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*));
> > 

Re: [PATCH 1/2] c++, libstdc++: implement __is_pointer built-in trait

2023-07-11 Thread François Dumont via Gcc-patches



On 10/07/2023 07:23, Ken Matsui via Libstdc++ 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** 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));