mirror of https://github.com/microsoft/clang.git
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:
parent
a9c6441c73
commit
175df89a97
|
@ -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<
|
||||
|
|
|
@ -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>() ||
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue