forked from OSchip/llvm-project
Delay linkage checks when validating the weakref attribute.
llvm-svn: 172678
This commit is contained in:
parent
4dc2ba15d7
commit
b306900200
|
@ -4314,10 +4314,17 @@ bool Sema::inferObjCARCLifetime(ValueDecl *decl) {
|
|||
|
||||
static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND) {
|
||||
// 'weak' only applies to declarations with external linkage.
|
||||
WeakAttr *WA = ND.getAttr<WeakAttr>();
|
||||
if (WA && ND.getLinkage() != ExternalLinkage) {
|
||||
S.Diag(WA->getLocation(), diag::err_attribute_weak_static);
|
||||
ND.dropAttr<WeakAttr>();
|
||||
if (WeakAttr *Attr = ND.getAttr<WeakAttr>()) {
|
||||
if (ND.getLinkage() != ExternalLinkage) {
|
||||
S.Diag(Attr->getLocation(), diag::err_attribute_weak_static);
|
||||
ND.dropAttr<WeakAttr>();
|
||||
}
|
||||
}
|
||||
if (WeakRefAttr *Attr = ND.getAttr<WeakRefAttr>()) {
|
||||
if (ND.getLinkage() == ExternalLinkage) {
|
||||
S.Diag(Attr->getLocation(), diag::err_attribute_weakref_not_static);
|
||||
ND.dropAttr<WeakRefAttr>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1420,11 +1420,6 @@ static void handleWeakRefAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
|||
// This looks like a bug in gcc. We reject that for now. We should revisit
|
||||
// it if this behaviour is actually used.
|
||||
|
||||
if (nd->getLinkage() == ExternalLinkage) {
|
||||
S.Diag(Attr.getLoc(), diag::err_attribute_weakref_not_static);
|
||||
return;
|
||||
}
|
||||
|
||||
// GCC rejects
|
||||
// static ((alias ("y"), weakref)).
|
||||
// Should we? How to check that weakref is before or after alias?
|
||||
|
@ -4583,7 +4578,8 @@ void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
|
|||
// but that looks really pointless. We reject it.
|
||||
if (Inheritable && D->hasAttr<WeakRefAttr>() && !D->hasAttr<AliasAttr>()) {
|
||||
Diag(AttrList->getLoc(), diag::err_attribute_weakref_without_alias) <<
|
||||
dyn_cast<NamedDecl>(D)->getNameAsString();
|
||||
cast<NamedDecl>(D)->getNameAsString();
|
||||
D->dropAttr<WeakRefAttr>();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,4 +28,7 @@ int a7() __attribute__((weakref ("f1"))); // expected-error {{weakref declaratio
|
|||
int a8 __attribute__((weakref ("v1"))); // expected-error {{weakref declaration must have internal linkage}}
|
||||
|
||||
// gcc accepts this
|
||||
int a9 __attribute__((weakref)); // expected-error {{weakref declaration must have internal linkage}}
|
||||
int a9 __attribute__((weakref)); // expected-error {{weakref declaration of 'a9' must also have an alias attribute}}
|
||||
|
||||
static int a10();
|
||||
int a10() __attribute__((weakref ("foo")));
|
||||
|
|
Loading…
Reference in New Issue