aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2018-11-09 19:37:18 +0000
committerAaron Ballman <aaron@aaronballman.com>2018-11-09 19:37:18 +0000
commit29b9417c18f6a4b529fe7ced36cc3f575e56ca51 (patch)
tree9b8a66cf84792cab3523a1ea8a9c027735ce0324
parentdf5383b4bc12e35f6ad2f9175883aa7c5ff34dd5 (diff)
Allow a double-underscore spelling of Clang attributes using double square bracket syntax.
This matches a similar behavior with GCC accepting [[gnu::__attr__]] as a alias for [[gnu::attr]] in that clang attributes can now be spelled with two leading and trailing underscores. I had always intended for this to work, but missed the critical bit. We already had an existing test in test/Preprocessor/has_attribute.cpp for [[clang::__fallthrough__]] but using that spelling would still give an "unknown attribute" diagnostic. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@346547 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/ParsedAttr.cpp11
-rw-r--r--test/SemaCXX/attr-optnone.cpp6
-rw-r--r--test/SemaCXX/switch-implicit-fallthrough.cpp15
3 files changed, 25 insertions, 7 deletions
diff --git a/lib/Sema/ParsedAttr.cpp b/lib/Sema/ParsedAttr.cpp
index 4c46063e2c..59e5aab677 100644
--- a/lib/Sema/ParsedAttr.cpp
+++ b/lib/Sema/ParsedAttr.cpp
@@ -122,11 +122,12 @@ static StringRef normalizeAttrName(StringRef AttrName,
ParsedAttr::Syntax SyntaxUsed) {
// Normalize the attribute name, __foo__ becomes foo. This is only allowable
// for GNU attributes, and attributes using the double square bracket syntax.
- bool IsGNU = SyntaxUsed == ParsedAttr::AS_GNU ||
- ((SyntaxUsed == ParsedAttr::AS_CXX11 ||
- SyntaxUsed == ParsedAttr::AS_C2x) &&
- NormalizedScopeName == "gnu");
- if (IsGNU && AttrName.size() >= 4 && AttrName.startswith("__") &&
+ bool ShouldNormalize =
+ SyntaxUsed == ParsedAttr::AS_GNU ||
+ ((SyntaxUsed == ParsedAttr::AS_CXX11 ||
+ SyntaxUsed == ParsedAttr::AS_C2x) &&
+ (NormalizedScopeName == "gnu" || NormalizedScopeName == "clang"));
+ if (ShouldNormalize && AttrName.size() >= 4 && AttrName.startswith("__") &&
AttrName.endswith("__"))
AttrName = AttrName.slice(2, AttrName.size() - 2);
diff --git a/test/SemaCXX/attr-optnone.cpp b/test/SemaCXX/attr-optnone.cpp
index 1e02653b95..c8e85eec37 100644
--- a/test/SemaCXX/attr-optnone.cpp
+++ b/test/SemaCXX/attr-optnone.cpp
@@ -72,8 +72,10 @@ struct B2 {
};
// Verify that we can handle the [[_Clang::optnone]] and
-// [[__clang__::optnone]] spellings.
+// [[__clang__::optnone]] spellings, as well as [[clang::__optnone__]].
[[_Clang::optnone]] int foo3();
[[__clang__::optnone]] int foo4(); // expected-warning {{'__clang__' is a predefined macro name, not an attribute scope specifier; did you mean '_Clang' instead?}}
+[[clang::__optnone__]] int foo5();
+[[_Clang::__optnone__]] int foo6();
-[[_Clang::optnone]] int foo5; // expected-warning {{'optnone' attribute only applies to functions}}
+[[_Clang::optnone]] int foo7; // expected-warning {{'optnone' attribute only applies to functions}}
diff --git a/test/SemaCXX/switch-implicit-fallthrough.cpp b/test/SemaCXX/switch-implicit-fallthrough.cpp
index 9540b1ff28..6ccac122cf 100644
--- a/test/SemaCXX/switch-implicit-fallthrough.cpp
+++ b/test/SemaCXX/switch-implicit-fallthrough.cpp
@@ -314,3 +314,18 @@ int fallthrough_targets(int n) {
}
return n;
}
+
+int fallthrough_alt_spelling(int n) {
+ switch (n) {
+ case 0:
+ n++;
+ [[clang::fallthrough]];
+ case 1:
+ n++;
+ [[clang::__fallthrough__]];
+ case 2:
+ n++;
+ break;
+ }
+ return n;
+}