]> granicus.if.org Git - clang/commitdiff
Allow standards-based attributes to have leading and trailing underscores.
authorAaron Ballman <aaron@aaronballman.com>
Thu, 15 Aug 2019 18:35:44 +0000 (18:35 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Thu, 15 Aug 2019 18:35:44 +0000 (18:35 +0000)
This gives library implementers a way to use standards-based attributes that do not conflict with user-defined macros of the same name. Attributes in C2x require this behavior normatively (C2x 6.7.11p4), but there's no reason to not have the same behavior in C++, especially given that such attributes may be used by a C library consumed by a C++ compilation.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@369033 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/ParsedAttr.cpp
test/Preprocessor/has_attribute.cpp
test/Preprocessor/has_c_attribute.c
test/Sema/attr-cx2.c
test/SemaCXX/attr-cxx0x.cpp

index 5c04443460bc27ea4b974733beddc89e82902575..6c103081c60cf12e1ef0d4437dfe9d32c67d6f8f 100644 (file)
@@ -125,7 +125,8 @@ static StringRef normalizeAttrName(StringRef AttrName,
       SyntaxUsed == ParsedAttr::AS_GNU ||
       ((SyntaxUsed == ParsedAttr::AS_CXX11 ||
         SyntaxUsed == ParsedAttr::AS_C2x) &&
-       (NormalizedScopeName == "gnu" || NormalizedScopeName == "clang"));
+       (NormalizedScopeName.empty() || NormalizedScopeName == "gnu" ||
+        NormalizedScopeName == "clang"));
   if (ShouldNormalize && AttrName.size() >= 4 && AttrName.startswith("__") &&
       AttrName.endswith("__"))
     AttrName = AttrName.slice(2, AttrName.size() - 2);
index 83ee0e3c6cfae708fbfff11f0ba0fc256624dc23..e7303c7c5b4dda46e0484dcd29ba2abe9b83b27d 100644 (file)
@@ -31,6 +31,9 @@ __clang__::fallthrough: __has_cpp_attribute(__clang__::fallthrough)
 // CHECK: _Clang::fallthrough: 201603L
 CXX11(_Clang::fallthrough)
 
+// CHECK: __nodiscard__: 201907L
+CXX11(__nodiscard__)
+
 // CHECK: __gnu__::__const__: 1
 CXX11(__gnu__::__const__)
 
index dc22da7e4cd600cf6184443f602a113566e8f5b0..843a67a2646c1f0dcfb6247cc34bb65406aca8bc 100644 (file)
@@ -10,3 +10,7 @@
   int does_not_have_selectany();
 #endif
 
+// CHECK: has_nodiscard_underscore
+#if __has_c_attribute(__nodiscard__)
+  int has_nodiscard_underscore();
+#endif
index ec74edf058ef24ac4613172124cae717c9c634da..561b88edfc84f0122f8707a141c4fb1e55643f9a 100644 (file)
@@ -24,3 +24,6 @@ void foo2(void) [[clang::unavailable("not available - replaced")]]; // expected-
 void bar(void) {
   foo2(); // expected-error {{'foo2' is unavailable: not available - replaced}}
 }
+
+[[nodiscard]] int without_underscores(void);
+[[__nodiscard__]] int underscores(void);
index 6ba89a62d70de7d5e5aa680434f610f59348bb13..b405e113948187397a4c0bdaa95eaff5a333cc33 100644 (file)
@@ -46,7 +46,7 @@ static_assert(alignof(outer<int,char>::inner<double,short>) == alignof(int) * al
 
 static_assert(alignof(int(int)) >= 1, "alignof(function) not positive"); // expected-error{{invalid application of 'alignof' to a function type}}
 
-[[__carries_dependency__]]  // expected-warning{{unknown attribute '__carries_dependency__' ignored}}
+[[__carries_dependency__]]
 void func(void);
 
 alignas(4) auto PR19252 = 0;