From: Patrick Palka <ppalka@redhat.com>
To: Ken Matsui <kmatsui@cs.washington.edu>
Cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org
Subject: Re: [PATCH v7 5/6] c++, libstdc++: implement __is_void built-in trait
Date: Tue, 20 Jun 2023 12:00:59 -0400 (EDT) [thread overview]
Message-ID: <5921351a-1a1f-a4ba-7074-2a57b8854d4a@idea> (raw)
In-Reply-To: <20230612224909.21188-6-kmatsui@cs.washington.edu>
On Mon, 12 Jun 2023, Ken Matsui via Libstdc++ wrote:
> This patch implements built-in trait for std::is_void. Since the new built-in
> name is __is_void, to avoid unintentional macro replacement, this patch also
> involves the removal of the existing __is_void in helper_functions.h and
> cpp_type_traits.h and renaming __is_void to ____is_void in the test file,
> pr46567.C.
Hmm, I suspect an __is_void built-in won't show an improvement over
the current is_void implementation in terms of four explicit specializations.
And given the __is_void name conflict in cpp_type_traits.h (which means
GCC trunk will reject older libstdc++ headers at least until we get
smarter about how we recognize built-ins), I'm leaning towards not
implementing an __is_void built-in for now.
In that case we should probably define a built-in for is_object since
we can no longer implement it solely in terms of other built-ins, and
fortunately the name __is_object seems to never have been used in
libstdc++ so we won't have to deal with any name conflicts unlike with
__is_void.
Jonathan, what do you think?
>
> gcc/cp/ChangeLog:
>
> * cp-trait.def: Define __is_void.
> * constraint.cc (diagnose_trait_expr): Handle CPTK_IS_VOID.
> * semantics.cc (trait_expr_value): Likewise.
> (finish_trait_expr): Likewise.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/tm/pr46567.C (__is_void): Rename to ...
> (____is_void): ... this.
> * g++.dg/ext/has-builtin-1.C: Test existence of __is_void.
> * g++.dg/ext/is_void.C: New test.
>
> libstdc++-v3/ChangeLog:
>
> * include/debug/helper_functions.h (_DiffTraits): Stop using
> __is_void.
> * include/bits/cpp_type_traits.h (__is_void): Remove unused __is_void.
> * include/std/type_traits (is_void_v): Use __is_void built-in
> trait.
>
> Signed-off-by: Ken Matsui <kmatsui@cs.washington.edu>
> ---
> 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_void.C | 35 +++++++++++++++++++
> gcc/testsuite/g++.dg/tm/pr46567.C | 6 ++--
> libstdc++-v3/include/bits/cpp_type_traits.h | 15 --------
> libstdc++-v3/include/debug/helper_functions.h | 5 ++-
> libstdc++-v3/include/std/type_traits | 6 ++++
> 9 files changed, 57 insertions(+), 21 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/ext/is_void.C
>
> diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
> index 927605c6cb7..e8cd98eb2c7 100644
> --- a/gcc/cp/constraint.cc
> +++ b/gcc/cp/constraint.cc
> @@ -3757,6 +3757,9 @@ diagnose_trait_expr (tree expr, tree args)
> case CPTK_IS_FUNCTION:
> inform (loc, " %qT is not a function", t1);
> break;
> + case CPTK_IS_VOID:
> + inform (loc, " %qT is not a void type", 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 3cd3babc242..8e76668f6ed 100644
> --- a/gcc/cp/cp-trait.def
> +++ b/gcc/cp/cp-trait.def
> @@ -84,6 +84,7 @@ 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_FUNCTION, "__is_function", 1)
> +DEFTRAIT_EXPR (IS_VOID, "__is_void", 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 b976633645a..c4d44413dce 100644
> --- a/gcc/cp/semantics.cc
> +++ b/gcc/cp/semantics.cc
> @@ -12075,6 +12075,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
> case CPTK_IS_FUNCTION:
> return type_code1 == FUNCTION_TYPE;
>
> + case CPTK_IS_VOID:
> + return VOID_TYPE_P (type1);
> +
> case CPTK_IS_FINAL:
> return CLASS_TYPE_P (type1) && CLASSTYPE_FINAL (type1);
>
> @@ -12297,6 +12300,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2)
> case CPTK_IS_SAME:
> case CPTK_IS_REFERENCE:
> case CPTK_IS_FUNCTION:
> + case CPTK_IS_VOID:
> 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 90eb00ebf2d..b96cc9e6f50 100644
> --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C
> +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C
> @@ -152,3 +152,6 @@
> #if !__has_builtin (__is_function)
> # error "__has_builtin (__is_function) failed"
> #endif
> +#if !__has_builtin (__is_void)
> +# error "__has_builtin (__is_void) failed"
> +#endif
> diff --git a/gcc/testsuite/g++.dg/ext/is_void.C b/gcc/testsuite/g++.dg/ext/is_void.C
> new file mode 100644
> index 00000000000..707f0d6875b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ext/is_void.C
> @@ -0,0 +1,35 @@
> +// { dg-do compile { target c++11 } }
> +
> +#include <testsuite_tr1.h>
> +
> +using namespace __gnu_test;
> +
> +#define SA(X) static_assert((X),#X)
> +#define SA_TEST_CATEGORY(TRAIT, TYPE, EXPECT) \
> + SA(TRAIT(TYPE) == EXPECT); \
> + SA(TRAIT(const TYPE) == EXPECT); \
> + SA(TRAIT(volatile TYPE) == EXPECT); \
> + SA(TRAIT(const volatile TYPE) == EXPECT)
> +
> +SA_TEST_CATEGORY(__is_void, void, true);
> +
> +SA_TEST_CATEGORY(__is_void, char, false);
> +SA_TEST_CATEGORY(__is_void, signed char, false);
> +SA_TEST_CATEGORY(__is_void, unsigned char, false);
> +SA_TEST_CATEGORY(__is_void, wchar_t, false);
> +SA_TEST_CATEGORY(__is_void, short, false);
> +SA_TEST_CATEGORY(__is_void, unsigned short, false);
> +SA_TEST_CATEGORY(__is_void, int, false);
> +SA_TEST_CATEGORY(__is_void, unsigned int, false);
> +SA_TEST_CATEGORY(__is_void, long, false);
> +SA_TEST_CATEGORY(__is_void, unsigned long, false);
> +SA_TEST_CATEGORY(__is_void, long long, false);
> +SA_TEST_CATEGORY(__is_void, unsigned long long, false);
> +SA_TEST_CATEGORY(__is_void, float, false);
> +SA_TEST_CATEGORY(__is_void, double, false);
> +SA_TEST_CATEGORY(__is_void, long double, false);
> +
> +// Sanity check.
> +SA_TEST_CATEGORY(__is_void, ClassType, false);
> +SA_TEST_CATEGORY(__is_void, IncompleteClass, false);
> +SA_TEST_CATEGORY(__is_void, IncompleteUnion, false);
> diff --git a/gcc/testsuite/g++.dg/tm/pr46567.C b/gcc/testsuite/g++.dg/tm/pr46567.C
> index 6d791484448..e689e293bd4 100644
> --- a/gcc/testsuite/g++.dg/tm/pr46567.C
> +++ b/gcc/testsuite/g++.dg/tm/pr46567.C
> @@ -72,13 +72,13 @@ namespace std __attribute__ ((__visibility__ ("default"))) {
> typedef __true_type __type;
> };
> template<typename _Tp>
> - struct __is_void
> + struct ____is_void
> {
> enum { __value = 0 };
> typedef __false_type __type;
> };
> template<>
> - struct __is_void<void>
> + struct ____is_void<void>
> {
> enum { __value = 1 };
> typedef __true_type __type;
> @@ -222,7 +222,7 @@ namespace std __attribute__ ((__visibility__ ("default"))) {
> { };
> template<typename _Tp>
> struct __is_fundamental
> - : public __traitor<__is_void<_Tp>, __is_arithmetic<_Tp> >
> + : public __traitor<____is_void<_Tp>, __is_arithmetic<_Tp> >
> { };
> template<typename _Tp>
> struct __is_scalar
> diff --git a/libstdc++-v3/include/bits/cpp_type_traits.h b/libstdc++-v3/include/bits/cpp_type_traits.h
> index 4312f32a4e0..d329bc5b208 100644
> --- a/libstdc++-v3/include/bits/cpp_type_traits.h
> +++ b/libstdc++-v3/include/bits/cpp_type_traits.h
> @@ -105,21 +105,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> typedef __true_type __type;
> };
>
> - // Holds if the template-argument is a void type.
> - template<typename _Tp>
> - struct __is_void
> - {
> - enum { __value = 0 };
> - typedef __false_type __type;
> - };
> -
> - template<>
> - struct __is_void<void>
> - {
> - enum { __value = 1 };
> - typedef __true_type __type;
> - };
> -
> //
> // Integer types
> //
> diff --git a/libstdc++-v3/include/debug/helper_functions.h b/libstdc++-v3/include/debug/helper_functions.h
> index dccf8e9e5e6..66b4e9e1ecf 100644
> --- a/libstdc++-v3/include/debug/helper_functions.h
> +++ b/libstdc++-v3/include/debug/helper_functions.h
> @@ -66,13 +66,12 @@ namespace __gnu_debug
> typedef
> typename std::iterator_traits<_Iterator>::difference_type _ItDiffType;
>
> - template<typename _DiffType,
> - typename = typename std::__is_void<_DiffType>::__type>
> + template<typename _DiffType, typename = _DiffType>
> struct _DiffTraits
> { typedef _DiffType __type; };
>
> template<typename _DiffType>
> - struct _DiffTraits<_DiffType, std::__true_type>
> + struct _DiffTraits<_DiffType, void>
> { typedef std::ptrdiff_t __type; };
>
> typedef typename _DiffTraits<_ItDiffType>::__type _DiffType;
> diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
> index 954b57518de..780fcc00135 100644
> --- a/libstdc++-v3/include/std/type_traits
> +++ b/libstdc++-v3/include/std/type_traits
> @@ -3166,8 +3166,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> * @{
> * @ingroup variable_templates
> */
> +#if __has_builtin(__is_void)
> +template <typename _Tp>
> + inline constexpr bool is_void_v = __is_void(_Tp);
> +#else
> template <typename _Tp>
> inline constexpr bool is_void_v = is_void<_Tp>::value;
> +#endif
We should instead optimize this the way we do for the class template, by
defining 4 explicit specializations of is_void_v.
> +
> template <typename _Tp>
> inline constexpr bool is_null_pointer_v = is_null_pointer<_Tp>::value;
> template <typename _Tp>
> --
> 2.41.0
>
>
next prev parent reply other threads:[~2023-06-20 16:01 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-26 4:30 [PATCH 00/10] c++, libstdc++: get std::is_object to dispatch to new built-in traits Ken Matsui
2023-03-26 4:30 ` [PATCH 01/10] c++: implement __is_reference built-in trait Ken Matsui
2023-03-26 4:30 ` [PATCH 02/10] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-03-26 4:30 ` [PATCH 03/10] c++: implement __is_function built-in trait Ken Matsui
2023-03-26 4:30 ` [PATCH 04/10] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-03-26 4:30 ` [PATCH 05/10] libstdc++: use std::is_void instead of __is_void in helper_functions.h Ken Matsui
2023-03-26 4:30 ` [PATCH 06/10] libstdc++: remove unused __is_void in cpp_type_traits.h Ken Matsui
2023-03-26 4:30 ` [PATCH 07/10] c++: rename __is_void defined in pr46567.C to ____is_void Ken Matsui
2023-03-26 4:30 ` [PATCH 08/10] c++: implement __is_void built-in trait Ken Matsui
2023-03-26 4:30 ` [PATCH 09/10] libstdc++: use new built-in trait __is_void for std::is_void Ken Matsui
2023-03-26 4:30 ` [PATCH 10/10] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-03-30 18:32 ` [PATCH 0/7] c++, libstdc++: get std::is_object to " Ken Matsui
2023-03-30 18:39 ` [PATCH v2 " Ken Matsui
2023-03-30 18:39 ` [PATCH v2 1/7] c++: implement __is_reference built-in trait Ken Matsui
2023-03-30 18:39 ` [PATCH v2 2/7] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-03-30 18:39 ` [PATCH v2 3/7] c++: implement __is_function built-in trait Ken Matsui
2023-03-30 18:39 ` [PATCH v2 4/7] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-03-30 18:39 ` [PATCH v2 5/7] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-03-30 18:39 ` [PATCH v2 6/7] libstdc++: use new built-in trait __is_void for std::is_void Ken Matsui
2023-03-30 18:39 ` [PATCH v2 7/7] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-04-02 7:53 ` [PATCH v3 0/6] c++, libstdc++: get std::is_object to " Ken Matsui
2023-04-02 7:53 ` [PATCH v3 1/6] c++: implement __is_reference built-in trait Ken Matsui
2023-04-02 7:53 ` [PATCH v3 2/6] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-04-02 7:53 ` [PATCH v3 3/6] c++: implement __is_function built-in trait Ken Matsui
2023-04-02 7:53 ` [PATCH v3 4/6] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-06-09 17:54 ` Patrick Palka
2023-06-09 23:53 ` Ken Matsui
2023-04-02 7:53 ` [PATCH v3 5/6] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-04-02 7:53 ` [PATCH v3 6/6] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-06-11 2:43 ` [PATCH v4 0/6] c++, libstdc++: get std::is_object to " Ken Matsui
2023-06-11 2:43 ` [PATCH v4 1/6] c++: implement __is_reference built-in trait Ken Matsui
2023-06-11 2:43 ` [PATCH v4 2/6] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-06-12 18:09 ` François Dumont
2023-06-12 18:13 ` Ken Matsui
2023-06-11 2:43 ` [PATCH v4 3/6] c++: implement __is_function built-in trait Ken Matsui
2023-06-11 2:43 ` [PATCH v4 4/6] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-06-11 2:43 ` [PATCH v4 5/6] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-06-11 2:43 ` [PATCH v4 6/6] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-06-12 22:22 ` [PATCH v5 0/6] c++, libstdc++: get std::is_object to " Ken Matsui
2023-06-12 22:22 ` [PATCH v5 1/6] c++: implement __is_reference built-in trait Ken Matsui
2023-06-12 22:22 ` [PATCH v5 2/6] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-06-12 22:22 ` [PATCH v5 3/6] c++: implement __is_function built-in trait Ken Matsui
2023-06-12 22:22 ` [PATCH v5 4/6] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-06-12 22:22 ` [PATCH v5 5/6] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-06-12 22:22 ` [PATCH v5 6/6] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-06-14 5:10 ` François Dumont
2023-06-14 5:25 ` Ken Matsui
2023-06-12 22:39 ` [PATCH v6 0/6] c++, libstdc++: get std::is_object to " Ken Matsui
2023-06-12 22:39 ` [PATCH v6 1/6] c++: implement __is_reference built-in trait Ken Matsui
2023-06-12 22:39 ` [PATCH v6 2/6] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-06-12 22:39 ` [PATCH v6 3/6] c++: implement __is_function built-in trait Ken Matsui
2023-06-12 22:39 ` [PATCH v6 4/6] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-06-12 22:39 ` [PATCH v6 5/6] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-06-12 22:39 ` [PATCH v6 6/6] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-06-12 22:47 ` [PATCH v7 0/6] c++, libstdc++: get std::is_object to " Ken Matsui
2023-06-12 22:47 ` [PATCH v7 1/6] c++: implement __is_reference built-in trait Ken Matsui
2023-06-20 16:06 ` Patrick Palka
2023-06-12 22:47 ` [PATCH v7 2/6] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-06-20 16:07 ` Patrick Palka
2023-06-12 22:47 ` [PATCH v7 3/6] c++: implement __is_function built-in trait Ken Matsui
2023-06-20 16:05 ` Patrick Palka
2023-06-12 22:47 ` [PATCH v7 4/6] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-06-20 16:05 ` Patrick Palka
2023-06-12 22:47 ` [PATCH v7 5/6] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-06-20 16:00 ` Patrick Palka [this message]
2023-06-12 22:47 ` [PATCH v7 6/6] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-06-15 10:49 ` [PATCH v7 0/6] c++, libstdc++: get std::is_object to " Ken Matsui
2023-06-20 13:19 ` Ken Matsui
2023-06-20 15:32 ` Patrick Palka
2023-06-24 15:12 ` Ken Matsui
2023-07-08 5:08 ` [PATCH v8 " Ken Matsui
2023-07-08 5:08 ` [PATCH v8 1/6] c++: implement __is_reference built-in trait Ken Matsui
2023-07-08 5:08 ` [PATCH v8 2/6] libstdc++: use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-07-12 10:08 ` Jonathan Wakely
2023-07-08 5:08 ` [PATCH v8 3/6] c++: implement __is_function built-in trait Ken Matsui
2023-07-08 5:08 ` [PATCH v8 4/6] libstdc++: use new built-in trait __is_function for std::is_function Ken Matsui
2023-07-12 10:10 ` Jonathan Wakely
2023-07-08 5:08 ` [PATCH v8 5/6] c++, libstdc++: implement __is_void built-in trait Ken Matsui
2023-07-08 5:08 ` [PATCH v8 6/6] libstdc++: make std::is_object dispatch to new built-in traits Ken Matsui
2023-07-13 2:33 ` [PATCH v10 0/5] c++, libstdc++: Make " Ken Matsui
2023-07-13 2:33 ` [PATCH v10 1/5] c++: Implement __is_reference built-in trait Ken Matsui
2023-07-13 2:33 ` [PATCH v10 2/5] libstdc++: Use new built-in trait __is_reference for std::is_reference Ken Matsui
2023-07-13 2:56 ` Ken Matsui
2023-09-04 15:00 ` [PING][PATCH " Ken Matsui
2023-07-13 2:33 ` [PATCH v10 3/5] c++: Implement __is_function built-in trait Ken Matsui
2023-07-13 2:41 ` Ken Matsui
2023-08-22 19:52 ` Patrick Palka
2023-09-04 15:00 ` [PING][PATCH " Ken Matsui
2023-07-13 2:33 ` [PATCH v10 4/5] libstdc++: Use new built-in trait __is_function for std::is_function Ken Matsui
2023-08-08 20:35 ` Jonathan Wakely
2023-07-13 2:33 ` [PATCH v10 5/5] libstdc++: Make std::is_object dispatch to new built-in traits Ken Matsui
2023-09-01 13:00 ` [PING][PATCH " Ken Matsui
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5921351a-1a1f-a4ba-7074-2a57b8854d4a@idea \
--to=ppalka@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=kmatsui@cs.washington.edu \
--cc=libstdc++@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).