summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-10-02 05:36:02 +0000
committerTed Kremenek <kremenek@apple.com>2012-10-02 05:36:02 +0000
commit2f88c40ded8872754ced77ed2b39e7bb98f4b6a5 (patch)
tree618f4c2597089bb8f538b10a6698237f9e511716
parent5de91cc35f62342e5eb70175cb3ff5cc5db811c4 (diff)
downloadbcm5719-llvm-2f88c40ded8872754ced77ed2b39e7bb98f4b6a5.tar.gz
bcm5719-llvm-2f88c40ded8872754ced77ed2b39e7bb98f4b6a5.zip
Tweak diagnostic text to indicate that __weak on a local variable is only allowed
for ARC. Fixes <rdar://problem/12407705> llvm-svn: 164990
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td3
-rw-r--r--clang/lib/Sema/SemaDecl.cpp4
-rw-r--r--clang/test/SemaObjC/nonarc-weak.m16
3 files changed, 21 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index a527c84b436..648fe0b94a4 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -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">;
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 4382432a6fe..ddb41edc649 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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/clang/test/SemaObjC/nonarc-weak.m b/clang/test/SemaObjC/nonarc-weak.m
new file mode 100644
index 00000000000..912a0b160bf
--- /dev/null
+++ b/clang/test/SemaObjC/nonarc-weak.m
@@ -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
OpenPOWER on IntegriCloud