aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDecl.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2012-12-20 20:55:03 +0000
committerTed Kremenek <kremenek@apple.com>2012-12-20 20:55:03 +0000
commit7c441069a41e164498047aaed542d0d64bc11962 (patch)
tree6a63262ce9cb3185116c7bba59f4517d51faa9fe /lib/Sema/SemaDecl.cpp
parent7b00b84752b7f3cbd4079f88ddb359170b7073c1 (diff)
Warn if a __weak variable is initialized with an Objective-C object literal.
Such variables may immediately become nil or may have unpredictable behavior. Fixes <rdar://problem/12569201>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@170763 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDecl.cpp')
-rw-r--r--lib/Sema/SemaDecl.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 96e911d17b..9ca7782164 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -6780,13 +6780,30 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
// we do not warn to warn spuriously when 'x' and 'y' are on separate
// paths through the function. This should be revisited if
// -Wrepeated-use-of-weak is made flow-sensitive.
- if (VDecl->getType().getObjCLifetime() == Qualifiers::OCL_Strong) {
+ Qualifiers::ObjCLifetime Lifetime = VDecl->getType().getObjCLifetime();
+ if (Lifetime == Qualifiers::OCL_Strong) {
DiagnosticsEngine::Level Level =
Diags.getDiagnosticLevel(diag::warn_arc_repeated_use_of_weak,
Init->getLocStart());
if (Level != DiagnosticsEngine::Ignored)
getCurFunction()->markSafeWeakUse(Init);
}
+ else if (Lifetime == Qualifiers::OCL_Weak) {
+ // Check if we are initializing a __weak variable with an Objective-C
+ // object literal. Since there is no other strong reference, the
+ // __weak variable may immediately become nil.
+ Expr *InitSansParen = Init->IgnoreParenImpCasts();
+ switch (InitSansParen->getStmtClass()) {
+ default: break;
+ case Stmt::BlockExprClass:
+ case Stmt::ObjCArrayLiteralClass:
+ case Stmt::ObjCDictionaryLiteralClass:
+ case Stmt::ObjCStringLiteralClass:
+ Diag(VDecl->getLocation(), diag::warn_attribute_weak_objc_literal)
+ << Init->getSourceRange();
+ break;
+ }
+ }
}
Init = MaybeCreateExprWithCleanups(Init);