forked from OSchip/llvm-project
Allow standards-based attributes to have leading and trailing underscores.
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. llvm-svn: 369033
This commit is contained in:
parent
00782a4b68
commit
2ed4573e8f
|
@ -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);
|
||||
|
|
|
@ -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__)
|
||||
|
||||
|
|
|
@ -10,3 +10,7 @@
|
|||
int does_not_have_selectany();
|
||||
#endif
|
||||
|
||||
// CHECK: has_nodiscard_underscore
|
||||
#if __has_c_attribute(__nodiscard__)
|
||||
int has_nodiscard_underscore();
|
||||
#endif
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue