diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-10-02 05:36:02 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-10-02 05:36:02 +0000 |
commit | 2f88c40ded8872754ced77ed2b39e7bb98f4b6a5 (patch) | |
tree | 618f4c2597089bb8f538b10a6698237f9e511716 | |
parent | 5de91cc35f62342e5eb70175cb3ff5cc5db811c4 (diff) | |
download | bcm5719-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.td | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaObjC/nonarc-weak.m | 16 |
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 |