summaryrefslogtreecommitdiffstats
path: root/clang/test/Preprocessor/feature_tests.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2019-08-14 02:30:11 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2019-08-14 02:30:11 +0000
commitdac3ea4eb3f6fc75be4305b9b7ed1a861ea5993e (patch)
tree1871a1c31d1cfbf4fed4cd8a76fb226b51b6ef65 /clang/test/Preprocessor/feature_tests.cpp
parentf1d538cce54b4a2ae06b07cf5323b0137f5385d3 (diff)
downloadbcm5719-llvm-dac3ea4eb3f6fc75be4305b9b7ed1a861ea5993e.tar.gz
bcm5719-llvm-dac3ea4eb3f6fc75be4305b9b7ed1a861ea5993e.zip
Add __has_builtin support for builtin function-like type traits.
Summary: Previously __has_builtin(__builtin_*) would return false for __builtin_*s that we modeled as keywords rather than as functions (because they take type arguments). With this patch, all builtins that are called with function-call-like syntax return true from __has_builtin (covering __builtin_* and also the __is_* and __has_* type traits and the handful of similar builtins without such a prefix). Update the documentation on __has_builtin and on type traits to match. While doing this I noticed the type trait documentation was out of date and incomplete; that's fixed here too. Reviewers: aaron.ballman Subscribers: jfb, kristina, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D66100 llvm-svn: 368785
Diffstat (limited to 'clang/test/Preprocessor/feature_tests.cpp')
-rw-r--r--clang/test/Preprocessor/feature_tests.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clang/test/Preprocessor/feature_tests.cpp b/clang/test/Preprocessor/feature_tests.cpp
new file mode 100644
index 00000000000..50da228a4ef
--- /dev/null
+++ b/clang/test/Preprocessor/feature_tests.cpp
@@ -0,0 +1,43 @@
+// RUN: %clang_cc1 %s -triple=i686-apple-darwin9 -verify -DVERIFY
+// expected-no-diagnostics
+
+#ifndef __has_feature
+#error Should have __has_feature
+#endif
+
+#if __has_feature(something_we_dont_have)
+#error Bad
+#endif
+
+#if !__has_builtin(__builtin_huge_val) || \
+ !__has_builtin(__builtin_shufflevector) || \
+ !__has_builtin(__builtin_convertvector) || \
+ !__has_builtin(__builtin_trap) || \
+ !__has_builtin(__c11_atomic_init) || \
+ !__has_builtin(__builtin_launder) || \
+ !__has_feature(attribute_analyzer_noreturn) || \
+ !__has_feature(attribute_overloadable)
+#error Clang should have these
+#endif
+
+// These are technically implemented as keywords, but __has_builtin should
+// still return true.
+#if !__has_builtin(__builtin_LINE) || \
+ !__has_builtin(__builtin_FILE) || \
+ !__has_builtin(__builtin_FUNCTION) || \
+ !__has_builtin(__builtin_COLUMN) || \
+ !__has_builtin(__array_rank) || \
+ !__has_builtin(__underlying_type) || \
+ !__has_builtin(__is_trivial) || \
+ !__has_builtin(__has_unique_object_representations)
+#error Clang should have these
+#endif
+
+// This is a C-only builtin.
+#if __has_builtin(__builtin_types_compatible_p)
+#error Clang should not have this in C++ mode
+#endif
+
+#if __has_builtin(__builtin_insanity)
+#error Clang should not have this
+#endif
OpenPOWER on IntegriCloud