More coherent diagnostic when a stack variable is

declared __weak objc-gc mode.  // rdar://9666091.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132731 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Fariborz Jahanian 2011-06-07 20:15:46 +00:00
parent a9c6441c73
commit 175df89a97
3 changed files with 9 additions and 3 deletions

View File

@ -1178,6 +1178,8 @@ def warn_attribute_void_function_method : Warning<
"%select{functions|Objective-C method}1 without return value">;
def warn_attribute_weak_on_field : Warning<
"__weak attribute cannot be specified on a field declaration">;
def warn_gc_attribute_weak_on_local : Warning<
"Objective-C GC does not allow weak variables on the stack">;
def warn_attribute_weak_on_local : Warning<
"__weak attribute cannot be specified on an automatic variable">;
def warn_weak_identifier_undeclared : Warning<

View File

@ -3850,8 +3850,12 @@ void Sema::CheckVariableDeclaration(VarDecl *NewVD,
}
if (NewVD->hasLocalStorage() && T.isObjCGCWeak()
&& !NewVD->hasAttr<BlocksAttr>())
Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local);
&& !NewVD->hasAttr<BlocksAttr>()) {
if (getLangOptions().getGCMode() != LangOptions::NonGC)
Diag(NewVD->getLocation(), diag::warn_gc_attribute_weak_on_local);
else
Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local);
}
bool isVM = T->isVariablyModifiedType();
if (isVM || NewVD->hasAttr<CleanupAttr>() ||

View File

@ -6,6 +6,6 @@ struct S {
int main ()
{
__weak id local; // expected-warning {{__weak attribute cannot be specified on an automatic variable}}
__weak id local; // expected-warning {{Objective-C GC does not allow weak variables on the stack}}
}