]> granicus.if.org Git - clang/commitdiff
Tweak diagnostic text to indicate that __weak on a local variable is only allowed
authorTed Kremenek <kremenek@apple.com>
Tue, 2 Oct 2012 05:36:02 +0000 (05:36 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 2 Oct 2012 05:36:02 +0000 (05:36 +0000)
for ARC.  Fixes <rdar://problem/12407705>

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaObjC/nonarc-weak.m [new file with mode: 0644]

index a527c84b436494360d0880fca57df61b6d3a9be2..648fe0b94a4291d32bca8ba605584c52faa07c35 100644 (file)
@@ -1744,7 +1744,8 @@ def warn_nsobject_attribute : Warning<
   "__attribute ((NSObject)) may be put on a typedef only, "
   "attribute is ignored">, InGroup<NSobjectAttribute>;
 def warn_attribute_weak_on_local : Warning<
-  "__weak attribute cannot be specified on an automatic variable">,
+  "__weak attribute cannot be specified on an automatic variable when ARC "
+  "is not enabled">,
   InGroup<IgnoredAttributes>;
 def warn_weak_identifier_undeclared : Warning<
   "weak identifier %0 never declared">;
index 4382432a6fe00028836ce47f04170562e6a6e5b6..ddb41edc649f60d8effeea3e37b63bfde6e091b7 100644 (file)
@@ -4578,8 +4578,10 @@ bool Sema::CheckVariableDeclaration(VarDecl *NewVD,
       && !NewVD->hasAttr<BlocksAttr>()) {
     if (getLangOpts().getGC() != LangOptions::NonGC)
       Diag(NewVD->getLocation(), diag::warn_gc_attribute_weak_on_local);
-    else
+    else {
+      assert(!getLangOpts().ObjCAutoRefCount);
       Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local);
+    }
   }
   
   bool isVM = T->isVariablyModifiedType();
diff --git a/test/SemaObjC/nonarc-weak.m b/test/SemaObjC/nonarc-weak.m
new file mode 100644 (file)
index 0000000..912a0b1
--- /dev/null
@@ -0,0 +1,16 @@
+// RUN: %clang -fsyntax-only -Wunused-function %s > %t.nonarc 2>&1
+// RUN: %clang -fsyntax-only -Wunused-function -fobjc-arc %s > %t.arc 2>&1
+// RUN: FileCheck -input-file=%t.nonarc %s
+// RUN: FileCheck -input-file=%t.arc -check-prefix=ARC %s
+
+static void bar() {} // Intentionally unused.
+
+void foo(id self) {
+  __weak id weakSelf = self;
+}
+
+// CHECK: 9:13: warning: __weak attribute cannot be specified on an automatic variable when ARC is not enabled
+// CHECK: 6:13: warning: unused function 'bar'
+// CHECK: 2 warnings generated
+// ARC: 6:13: warning: unused function 'bar'
+// ARC: 1 warning generated