diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-08-14 02:30:11 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-08-14 02:30:11 +0000 |
commit | dac3ea4eb3f6fc75be4305b9b7ed1a861ea5993e (patch) | |
tree | 1871a1c31d1cfbf4fed4cd8a76fb226b51b6ef65 /clang/test/Preprocessor/feature_tests.cpp | |
parent | f1d538cce54b4a2ae06b07cf5323b0137f5385d3 (diff) | |
download | bcm5719-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.cpp | 43 |
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 |