]> granicus.if.org Git - clang/commitdiff
More coherent diagnostic when a stack variable is
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 7 Jun 2011 20:15:46 +0000 (20:15 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 7 Jun 2011 20:15:46 +0000 (20:15 +0000)
declared __weak objc-gc mode.  // rdar://9666091.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@132731 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaObjC/objc2-warn-weak-decl.m

index 53372bb627396619882349e0b682120d9a902872..9b6eaf3c18df441b4bcbd0f4fc9ae7efc388ae9a 100644 (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<
index e1872c2d7dbf3a8bf34aee8be37254c3c3ed087c..1adc8bd0ed58df8f258e74d791b8c42172555bb8 100644 (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>() ||
index 22a3fca91ba5ec5193271c3f58c9b4c5b42c3532..b85f7682a96b5eb37e94473c7037652d3564b48d 100644 (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}}
 }