aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r--lib/Sema/SemaChecking.cpp39
1 files changed, 15 insertions, 24 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index c2dabb45af..7d957ec408 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -5753,33 +5753,24 @@ static bool checkUnsafeAssignLiteral(Sema &S, SourceLocation Loc,
// immediately zapped in a weak reference. Note that we explicitly
// allow ObjCStringLiterals, since those are designed to never really die.
RHS = RHS->IgnoreParenImpCasts();
- // This enum needs to match with the 'select' in warn_arc_literal_assign.
- enum Kind { Dictionary = 0, Array, Block, BoxedE, None };
- unsigned kind = None;
- switch (RHS->getStmtClass()) {
- default:
- break;
- case Stmt::ObjCDictionaryLiteralClass:
- kind = Dictionary;
- break;
- case Stmt::ObjCArrayLiteralClass:
- kind = Array;
- break;
- case Stmt::BlockExprClass:
- kind = Block;
- break;
- case Stmt::ObjCBoxedExprClass:
- kind = BoxedE;
- break;
+
+ // Classification for diagnostic.
+ unsigned SelectVal = /* block literal */ 0;
+ if (!isa<BlockExpr>(RHS)) {
+ // This enum needs to match with the 'select' in
+ // warn_objc_arc_literal_assign (off-by-1).
+ Sema::ObjCLiteralKind Kind = S.CheckLiteralKind(RHS);
+ if (Kind == Sema::LK_String || Kind == Sema::LK_None)
+ return false;
+ SelectVal = (unsigned) Kind + 1;
}
- if (kind != None) {
- S.Diag(Loc, diag::warn_arc_literal_assign)
- << (unsigned) kind
+
+ S.Diag(Loc, diag::warn_arc_literal_assign)
+ << SelectVal
<< (isProperty ? 0 : 1)
<< RHS->getSourceRange();
- return true;
- }
- return false;
+
+ return true;
}
static bool checkUnsafeAssignObject(Sema &S, SourceLocation Loc,