Re: [PATCH] libstdc++: Support std::is_aggregate on clang++ (was [cfe-dev] clang++: std::is_aggregate unusable with clang-5.0/libstdc++-7)
On 02/08/17 00:05 +0900, Katsuhiko Nishimra wrote: On Mon, Jul 31, 2017 at 03:53:42PM +0100, Jonathan Wakely wrote: This __has_bultin check only exists for Clang, so should be replaced by the correct __is_identifier check, not left there in addition to it. I see. Actually I've guessed so, and thank you for clarifying it. I'm attaching a replacing patch. Please take a look at it. Thanks, I've committed this to GCC trunk and will backport it to the gcc-7-branch after the GCC 7.2 release (which is due any day now). I've also committed the attached patch which changes our feature detection for a __has_unique_object_representations builtin, as I expect that will also need to use __is_identifier if/when Clang supports it. Tested powerpc64le-linux, and also tested using Clang version 5.0.0 (trunk 307530) to confirm that __is_aggregate is correctly detected and std::is_aggregate is defined. From 1b22cc531027832cf1eb50b73354f1730edbba54 Mon Sep 17 00:00:00 2001 From: Katsuhiko NishimraDate: Tue, 1 Aug 2017 20:36:58 +0900 Subject: [PATCH] libstdc++: Support std::is_aggregate on clang++ Currently, libstdc++ tries to detect __is_aggregate built-in macro using __has_builtin, but this fails on clang++ because __has_builtin on clang++ detects only built-in functions, not built-in macros. This patch adds a test using __is_identifier. Tested with clang++ 6.0.0-svn309616-1~exp1 and g++ 7.1.0-11 on Debian unstable. --- libstdc++-v3/include/std/type_traits | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 390b6f40a..ee9c75baf 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2894,9 +2894,9 @@ template #if __GNUC__ >= 7 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 -#elif defined __has_builtin +#elif defined(__is_identifier) // For non-GNU compilers: -# if __has_builtin(__is_aggregate) +# if ! __is_identifier(__is_aggregate) # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 # endif #endif -- 2.13.3 commit 1b00aa3825ea05fea071f31d29aafff71a002c53 Author: Jonathan Wakely Date: Wed Aug 9 19:07:28 2017 +0100 Fix test for __has_unique_object_representations support in Clang * include/std/type_traits (_GLIBCXX_NO_BUILTIN_HAS_UNIQ_OBJ_REP): Replace with _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP and use __is_identifier to set it. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index ee9c75b..f021c42 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2873,14 +2873,16 @@ template template inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value; -#ifdef __has_builtin -# if !__has_builtin(__has_unique_object_representations) -// Try not to break non-GNU compilers that don't support the built-in: -# define _GLIBCXX_NO_BUILTIN_HAS_UNIQ_OBJ_REP 1 +#if __GNUC__ >= 7 +# define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1 +#elif defined(__is_identifier) +// For non-GNU compilers: +# if ! __is_identifier(__has_unique_object_representations) +# define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1 # endif #endif -#ifndef _GLIBCXX_NO_BUILTIN_HAS_UNIQ_OBJ_REP +#ifdef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP # define __cpp_lib_has_unique_object_representations 201606 /// has_unique_object_representations template @@ -2890,7 +2892,7 @@ template )> { }; #endif -#undef _GLIBCXX_NO_BUILTIN_HAS_UNIQ_OBJ_REP +#undef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP #if __GNUC__ >= 7 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1
Re: [PATCH] libstdc++: Support std::is_aggregate on clang++ (was [cfe-dev] clang++: std::is_aggregate unusable with clang-5.0/libstdc++-7)
On Mon, Jul 31, 2017 at 03:53:42PM +0100, Jonathan Wakely wrote: > This __has_bultin check only exists for Clang, so should be replaced > by the correct __is_identifier check, not left there in addition to > it. I see. Actually I've guessed so, and thank you for clarifying it. I'm attaching a replacing patch. Please take a look at it. From 1b22cc531027832cf1eb50b73354f1730edbba54 Mon Sep 17 00:00:00 2001 From: Katsuhiko NishimraDate: Tue, 1 Aug 2017 20:36:58 +0900 Subject: [PATCH] libstdc++: Support std::is_aggregate on clang++ Currently, libstdc++ tries to detect __is_aggregate built-in macro using __has_builtin, but this fails on clang++ because __has_builtin on clang++ detects only built-in functions, not built-in macros. This patch adds a test using __is_identifier. Tested with clang++ 6.0.0-svn309616-1~exp1 and g++ 7.1.0-11 on Debian unstable. --- libstdc++-v3/include/std/type_traits | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 390b6f40a..ee9c75baf 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2894,9 +2894,9 @@ template #if __GNUC__ >= 7 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 -#elif defined __has_builtin +#elif defined(__is_identifier) // For non-GNU compilers: -# if __has_builtin(__is_aggregate) +# if ! __is_identifier(__is_aggregate) # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 # endif #endif -- 2.13.3 signature.asc Description: PGP signature
Re: [PATCH] libstdc++: Support std::is_aggregate on clang++ (was [cfe-dev] clang++: std::is_aggregate unusable with clang-5.0/libstdc++-7)
On Mon, Jul 31, 2017 at 11:13 AM, Tim Songwrote: > > https://clang.llvm.org/docs/LanguageExtensions.html#checks-for-type-trait-primitives > seems to suggest using __has_extension instead. Hmm, that doesn't work. Oh well.
Re: [PATCH] libstdc++: Support std::is_aggregate on clang++ (was [cfe-dev] clang++: std::is_aggregate unusable with clang-5.0/libstdc++-7)
On Mon, Jul 31, 2017 at 10:53 AM, Jonathan Wakelywrote: > On 27/07/17 16:27 +0900, Katsuhiko Nishimra wrote: >> >> From 56c4a18d0d8c8ce7aa1239880138775e4db06645 Mon Sep 17 00:00:00 2001 >> From: Katsuhiko Nishimra >> Date: Thu, 27 Jul 2017 16:03:54 +0900 >> Subject: [PATCH] libstdc++: Support std::is_aggregate on clang++ >> >> Currently, libstdc++ tries to detect __is_aggregate built-in macro using >> __has_builtin, but this fails on clang++ because __has_builtin on >> clang++ detects only built-in functions, not built-in macros. This patch >> adds a test using __is_identifier. Tested on clang++ >> 5.0.0-svn308422-1~exp1 and g++ 7.1.0-10 from Debian unstable. >> --- >> libstdc++-v3/include/std/type_traits | 5 + >> 1 file changed, 5 insertions(+) >> >> diff --git a/libstdc++-v3/include/std/type_traits >> b/libstdc++-v3/include/std/type_traits >> index 390b6f40a..e7ec402fb 100644 >> --- a/libstdc++-v3/include/std/type_traits >> +++ b/libstdc++-v3/include/std/type_traits >> @@ -2894,6 +2894,11 @@ template >> >> #if __GNUC__ >= 7 >> # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 >> +#elif defined(__is_identifier) >> +// For clang >> +# if ! __is_identifier(__is_aggregate) >> +# define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 >> +# endif >> #elif defined __has_builtin >> // For non-GNU compilers: >> # if __has_builtin(__is_aggregate) > > > This __has_bultin check only exists for Clang, so should be replaced > by the correct __is_identifier check, not left there in addition to > it. > > https://clang.llvm.org/docs/LanguageExtensions.html#checks-for-type-trait-primitives seems to suggest using __has_extension instead.
Re: [PATCH] libstdc++: Support std::is_aggregate on clang++ (was [cfe-dev] clang++: std::is_aggregate unusable with clang-5.0/libstdc++-7)
On 27/07/17 16:27 +0900, Katsuhiko Nishimra wrote: From 56c4a18d0d8c8ce7aa1239880138775e4db06645 Mon Sep 17 00:00:00 2001 From: Katsuhiko NishimraDate: Thu, 27 Jul 2017 16:03:54 +0900 Subject: [PATCH] libstdc++: Support std::is_aggregate on clang++ Currently, libstdc++ tries to detect __is_aggregate built-in macro using __has_builtin, but this fails on clang++ because __has_builtin on clang++ detects only built-in functions, not built-in macros. This patch adds a test using __is_identifier. Tested on clang++ 5.0.0-svn308422-1~exp1 and g++ 7.1.0-10 from Debian unstable. --- libstdc++-v3/include/std/type_traits | 5 + 1 file changed, 5 insertions(+) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 390b6f40a..e7ec402fb 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2894,6 +2894,11 @@ template #if __GNUC__ >= 7 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 +#elif defined(__is_identifier) +// For clang +# if ! __is_identifier(__is_aggregate) +# define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 +# endif #elif defined __has_builtin // For non-GNU compilers: # if __has_builtin(__is_aggregate) This __has_bultin check only exists for Clang, so should be replaced by the correct __is_identifier check, not left there in addition to it.
[PATCH] libstdc++: Support std::is_aggregate on clang++ (was [cfe-dev] clang++: std::is_aggregate unusable with clang-5.0/libstdc++-7)
>From 56c4a18d0d8c8ce7aa1239880138775e4db06645 Mon Sep 17 00:00:00 2001 From: Katsuhiko NishimraDate: Thu, 27 Jul 2017 16:03:54 +0900 Subject: [PATCH] libstdc++: Support std::is_aggregate on clang++ Currently, libstdc++ tries to detect __is_aggregate built-in macro using __has_builtin, but this fails on clang++ because __has_builtin on clang++ detects only built-in functions, not built-in macros. This patch adds a test using __is_identifier. Tested on clang++ 5.0.0-svn308422-1~exp1 and g++ 7.1.0-10 from Debian unstable. --- libstdc++-v3/include/std/type_traits | 5 + 1 file changed, 5 insertions(+) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 390b6f40a..e7ec402fb 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -2894,6 +2894,11 @@ template #if __GNUC__ >= 7 # define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 +#elif defined(__is_identifier) +// For clang +# if ! __is_identifier(__is_aggregate) +# define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1 +# endif #elif defined __has_builtin // For non-GNU compilers: # if __has_builtin(__is_aggregate) -- 2.13.3