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