forked from OSchip/llvm-project
[Sema] Handle leading and trailing __ for GNU attributes
GNU attributes can have a leading and trailing __ appended/prepended to the attribute name. While the parser and AttributeList::getKind did the right thing, AttributeList::getAttributeSpellingListIndex did not. This fixes PR24565. llvm-svn: 245953
This commit is contained in:
parent
edae87d819
commit
a94e7b6acf
|
@ -109,6 +109,19 @@ void AttributePool::takePool(AttributeList *pool) {
|
||||||
|
|
||||||
#include "clang/Sema/AttrParsedAttrKinds.inc"
|
#include "clang/Sema/AttrParsedAttrKinds.inc"
|
||||||
|
|
||||||
|
static StringRef normalizeAttrName(StringRef AttrName, StringRef ScopeName,
|
||||||
|
AttributeList::Syntax SyntaxUsed) {
|
||||||
|
// Normalize the attribute name, __foo__ becomes foo. This is only allowable
|
||||||
|
// for GNU attributes.
|
||||||
|
bool IsGNU = SyntaxUsed == AttributeList::AS_GNU ||
|
||||||
|
(SyntaxUsed == AttributeList::AS_CXX11 && ScopeName == "gnu");
|
||||||
|
if (IsGNU && AttrName.size() >= 4 && AttrName.startswith("__") &&
|
||||||
|
AttrName.endswith("__"))
|
||||||
|
AttrName = AttrName.slice(2, AttrName.size() - 2);
|
||||||
|
|
||||||
|
return AttrName;
|
||||||
|
}
|
||||||
|
|
||||||
AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name,
|
AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name,
|
||||||
const IdentifierInfo *ScopeName,
|
const IdentifierInfo *ScopeName,
|
||||||
Syntax SyntaxUsed) {
|
Syntax SyntaxUsed) {
|
||||||
|
@ -118,13 +131,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name,
|
||||||
if (ScopeName)
|
if (ScopeName)
|
||||||
FullName += ScopeName->getName();
|
FullName += ScopeName->getName();
|
||||||
|
|
||||||
// Normalize the attribute name, __foo__ becomes foo. This is only allowable
|
AttrName = normalizeAttrName(AttrName, FullName, SyntaxUsed);
|
||||||
// for GNU attributes.
|
|
||||||
bool IsGNU = SyntaxUsed == AS_GNU || (SyntaxUsed == AS_CXX11 &&
|
|
||||||
FullName == "gnu");
|
|
||||||
if (IsGNU && AttrName.size() >= 4 && AttrName.startswith("__") &&
|
|
||||||
AttrName.endswith("__"))
|
|
||||||
AttrName = AttrName.slice(2, AttrName.size() - 2);
|
|
||||||
|
|
||||||
// Ensure that in the case of C++11 attributes, we look for '::foo' if it is
|
// Ensure that in the case of C++11 attributes, we look for '::foo' if it is
|
||||||
// unscoped.
|
// unscoped.
|
||||||
|
@ -138,8 +145,9 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name,
|
||||||
unsigned AttributeList::getAttributeSpellingListIndex() const {
|
unsigned AttributeList::getAttributeSpellingListIndex() const {
|
||||||
// Both variables will be used in tablegen generated
|
// Both variables will be used in tablegen generated
|
||||||
// attribute spell list index matching code.
|
// attribute spell list index matching code.
|
||||||
StringRef Name = AttrName->getName();
|
|
||||||
StringRef Scope = ScopeName ? ScopeName->getName() : "";
|
StringRef Scope = ScopeName ? ScopeName->getName() : "";
|
||||||
|
StringRef Name = normalizeAttrName(AttrName->getName(), Scope,
|
||||||
|
(AttributeList::Syntax)SyntaxUsed);
|
||||||
|
|
||||||
#include "clang/Sema/AttrSpellingListIndex.inc"
|
#include "clang/Sema/AttrSpellingListIndex.inc"
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@ int small __attribute__((mode(byte)));
|
||||||
// CHECK: int v __attribute__((visibility("hidden")));
|
// CHECK: int v __attribute__((visibility("hidden")));
|
||||||
int v __attribute__((visibility("hidden")));
|
int v __attribute__((visibility("hidden")));
|
||||||
|
|
||||||
|
// CHECK: char *PR24565() __attribute__((malloc))
|
||||||
|
char *PR24565() __attribute__((__malloc__));
|
||||||
|
|
||||||
// CHECK: class __attribute__((consumable("unknown"))) AttrTester1
|
// CHECK: class __attribute__((consumable("unknown"))) AttrTester1
|
||||||
class __attribute__((consumable(unknown))) AttrTester1 {
|
class __attribute__((consumable(unknown))) AttrTester1 {
|
||||||
// CHECK: void callableWhen() __attribute__((callable_when("unconsumed", "consumed")));
|
// CHECK: void callableWhen() __attribute__((callable_when("unconsumed", "consumed")));
|
||||||
|
|
Loading…
Reference in New Issue