diff mbox series

Fix preprocessor checks for Clang builtins

Message ID 20190702115015.GA3880@redhat.com
State New
Headers show
Series Fix preprocessor checks for Clang builtins | expand

Commit Message

Jonathan Wakely July 2, 2019, 11:50 a.m. UTC
Clang seems to define built-ins that start with "__builtin_" as
non-keywords, which means that we need to use __has_builtin to detect
them, not __is_identifier. The built-ins that don't start with
"__builtin_" are keywords, and can only be detected using
__is_identifier and not by __has_builtin.

	* include/bits/c++config (_GLIBCXX_HAVE_BUILTIN_LAUNDER)
	(_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED): Use __has_builtin
	instead of __is_identifier to detect Clang support.

Tested x86_64-linux, and verified that with Clang trunk both
std::is_constant_evaluated and std::launder get defined now.
commit 1c3222c168099afd726fd1101a2343a0603f5026
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Jul 2 10:51:16 2019 +0100

    Fix preprocessor checks for Clang builtins
    
    Clang seems to define built-ins that start with "__builtin_" as
    non-keywords, which means that we need to use __has_builtin to detect
    them, not __is_identifier. The built-ins that don't start with
    "__builtin_" are keywords, and can only be detected using
    __is_identifier and not by __has_builtin.
    
            * include/bits/c++config (_GLIBCXX_HAVE_BUILTIN_LAUNDER)
            (_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED): Use __has_builtin
            instead of __is_identifier to detect Clang support.
diff mbox series

Patch

diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index 746e35efbfc..c8e099aaadd 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -636,7 +636,7 @@  namespace std
 # if __GNUC__ >= 9
 #  define _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED 1
 # endif
-#elif defined(__is_identifier)
+#elif defined(__is_identifier) && defined(__has_builtin)
 // For non-GNU compilers:
 # if ! __is_identifier(__has_unique_object_representations)
 #  define _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP 1
@@ -644,10 +644,10 @@  namespace std
 # if ! __is_identifier(__is_aggregate)
 #  define _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE 1
 # endif
-# if ! __is_identifier(__builtin_launder)
+# if __has_builtin(__builtin_launder)
 #  define _GLIBCXX_HAVE_BUILTIN_LAUNDER 1
 # endif
-# if ! __is_identifier(__builtin_is_constant_evaluated)
+# if __has_builtin(__builtin_is_constant_evaluated)
 #  define _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED 1
 # endif
 #endif // GCC