From: Rafael Espindola Date: Wed, 16 Jan 2013 23:49:06 +0000 (+0000) Subject: Delay linkage checks when validating the weakref attribute. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d8a33b4cea46948f86afccf0ad3675aff924148;p=clang Delay linkage checks when validating the weakref attribute. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172678 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 0316654660..b85e94bce8 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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(); - if (WA && ND.getLinkage() != ExternalLinkage) { - S.Diag(WA->getLocation(), diag::err_attribute_weak_static); - ND.dropAttr(); + if (WeakAttr *Attr = ND.getAttr()) { + if (ND.getLinkage() != ExternalLinkage) { + S.Diag(Attr->getLocation(), diag::err_attribute_weak_static); + ND.dropAttr(); + } + } + if (WeakRefAttr *Attr = ND.getAttr()) { + if (ND.getLinkage() == ExternalLinkage) { + S.Diag(Attr->getLocation(), diag::err_attribute_weakref_not_static); + ND.dropAttr(); + } } } diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 5f9516f70e..acd075ee7f 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -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() && !D->hasAttr()) { Diag(AttrList->getLoc(), diag::err_attribute_weakref_without_alias) << - dyn_cast(D)->getNameAsString(); + cast(D)->getNameAsString(); + D->dropAttr(); return; } } diff --git a/test/SemaCXX/attr-weakref.cpp b/test/SemaCXX/attr-weakref.cpp index a34579198f..f3d7a6241c 100644 --- a/test/SemaCXX/attr-weakref.cpp +++ b/test/SemaCXX/attr-weakref.cpp @@ -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")));