From fd5f6866a7574f12ecac5cceb7359ff253f83145 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 14 Oct 2011 23:44:46 +0000 Subject: Add c_alignas and cxx_alignas features git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142020 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LanguageExtensions.html | 14 ++++++++++++++ lib/Lex/PPMacroExpansion.cpp | 3 +++ test/Lexer/has_extension.c | 8 ++++++++ test/Lexer/has_feature_c1x.c | 9 +++++++++ test/Lexer/has_feature_cxx0x.cpp | 9 +++++++++ 5 files changed, 43 insertions(+) diff --git a/docs/LanguageExtensions.html b/docs/LanguageExtensions.html index ef57a659c4..c4a8047f1f 100644 --- a/docs/LanguageExtensions.html +++ b/docs/LanguageExtensions.html @@ -40,6 +40,7 @@
  • C1X
  • @@ -476,6 +478,12 @@ with the -std=c++0x option when compiling C++ code.

    __has_extension(cxx_alias_templates) to determine if support for C++0x's alias declarations and alias templates is enabled.

    +

    C++0x alignment specifiers

    + +

    Use __has_feature(cxx_alignas) or +__has_extension(cxx_alignas) to determine if support for alignment +specifiers using alignas is enabled.

    +

    C++0x attributes

    Use __has_feature(cxx_attributes) or @@ -635,6 +643,12 @@ for variadic templates is enabled.

    C1X standard. As a result, all these features are enabled with the -std=c1x option when compiling C code.

    +

    C1X alignment specifiers

    + +

    Use __has_feature(c_alignas) or __has_extension(c_alignas) +to determine if support for alignment specifiers using _Alignas +is enabled.

    +

    C1X generic selections

    Use __has_feature(c_generic_selections) or diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 486ffbeb9c..9b20605124 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -609,11 +609,13 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { .Case("ownership_returns", true) .Case("ownership_takes", true) // C1X features + .Case("c_alignas", LangOpts.C1X) .Case("c_generic_selections", LangOpts.C1X) .Case("c_static_assert", LangOpts.C1X) // C++0x features .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus0x) .Case("cxx_alias_templates", LangOpts.CPlusPlus0x) + .Case("cxx_alignas", LangOpts.CPlusPlus0x) .Case("cxx_attributes", LangOpts.CPlusPlus0x) .Case("cxx_auto_type", LangOpts.CPlusPlus0x) //.Case("cxx_constexpr", false); @@ -702,6 +704,7 @@ static bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) { // must be less restrictive than HasFeature's. return llvm::StringSwitch(II->getName()) // C1X features supported by other languages as extensions. + .Case("c_alignas", true) .Case("c_generic_selections", true) .Case("c_static_assert", true) // C++0x features supported by other languages as extensions. diff --git a/test/Lexer/has_extension.c b/test/Lexer/has_extension.c index bc75a4a1c5..4c322c7ce7 100644 --- a/test/Lexer/has_extension.c +++ b/test/Lexer/has_extension.c @@ -28,3 +28,11 @@ int has_c_generic_selections(); int no_c_generic_selections(); #endif +// CHECK-PED-NONE: has_c_alignas +// CHECK-PED-ERR: no_c_alignas +#if __has_extension(c_alignas) +int has_c_alignas(); +#else +int no_c_alignas(); +#endif + diff --git a/test/Lexer/has_feature_c1x.c b/test/Lexer/has_feature_c1x.c index 6c0fb212cc..ca4e9b95ad 100644 --- a/test/Lexer/has_feature_c1x.c +++ b/test/Lexer/has_feature_c1x.c @@ -18,3 +18,12 @@ int no_generic_selections(); // CHECK-1X: has_generic_selections // CHECK-NO-1X: no_generic_selections + +#if __has_feature(c_alignas) +int has_alignas(); +#else +int no_alignas(); +#endif + +// CHECK-1X: has_alignas +// CHECK-NO-1X: no_alignas diff --git a/test/Lexer/has_feature_cxx0x.cpp b/test/Lexer/has_feature_cxx0x.cpp index 5813562de7..f2b4576b57 100644 --- a/test/Lexer/has_feature_cxx0x.cpp +++ b/test/Lexer/has_feature_cxx0x.cpp @@ -173,3 +173,12 @@ int no_implicit_moves(); // CHECK-0X: has_implicit_moves // CHECK-NO-0X: no_implicit_moves + +#if __has_feature(cxx_alignas) +int has_alignas(); +#else +int no_alignas(); +#endif + +// CHECK-0X: has_alignas +// CHECK-NO-0X: no_alignas -- cgit v1.2.3