forked from OSchip/llvm-project
Change checkUnsafeAssignLiteral() to use the new Sema::CheckLiteralKind().
Along the way, fix a bug in CheckLiteralKind(), previously in diagnoseObjCLiteralComparison, where we didn't ignore parentheses in boxed expressions for purpose of classification. In other words, both @42 and @(42) should be classified as numeric literals. llvm-svn: 170931
This commit is contained in:
parent
01a33f82d2
commit
44c2a2a26e
|
@ -3690,7 +3690,7 @@ def warn_arc_retained_property_assign : Warning<
|
|||
"; object will be released after assignment">,
|
||||
InGroup<ARCUnsafeRetainedAssign>;
|
||||
def warn_arc_literal_assign : Warning<
|
||||
"assigning %select{dictionary literal|array literal|block literal|boxed expression}0"
|
||||
"assigning %select{block literal|array literal|dictionary literal|numeric literal|boxed expression}0"
|
||||
" to a weak %select{property|variable}1"
|
||||
"; object will be released after assignment">,
|
||||
InGroup<ARCUnsafeRetainedAssign>;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -6875,7 +6875,7 @@ Sema::ObjCLiteralKind Sema::CheckLiteralKind(Expr *FromE) {
|
|||
// "dictionary literal"
|
||||
return LK_Dictionary;
|
||||
case Stmt::ObjCBoxedExprClass: {
|
||||
Expr *Inner = cast<ObjCBoxedExpr>(FromE)->getSubExpr();
|
||||
Expr *Inner = cast<ObjCBoxedExpr>(FromE)->getSubExpr()->IgnoreParens();
|
||||
switch (Inner->getStmtClass()) {
|
||||
case Stmt::IntegerLiteralClass:
|
||||
case Stmt::FloatingLiteralClass:
|
||||
|
|
|
@ -740,11 +740,15 @@ void rdar12569201(id key, id value) {
|
|||
__weak id y = @{ key : value }; // expected-warning {{assigning dictionary literal to a weak variable; object will be released after assignment}}
|
||||
__weak id z = @[ value ]; // expected-warning {{assigning array literal to a weak variable; object will be released after assignment}}
|
||||
__weak id b = ^() {}; // expected-warning {{assigning block literal to a weak variable; object will be released after assignment}}
|
||||
__weak id e = @(42); // expected-warning {{assigning boxed expression to a weak variable; object will be released after assignment}}
|
||||
__weak id n = @42; // expected-warning {{assigning numeric literal to a weak variable; object will be released after assignment}}
|
||||
__weak id e = @(42); // expected-warning {{assigning numeric literal to a weak variable; object will be released after assignment}}
|
||||
__weak id m = @(41 + 1); // expected-warning {{assigning boxed expression to a weak variable; object will be released after assignment}}
|
||||
|
||||
// Assignments.
|
||||
y = @{ key : value }; // expected-warning {{assigning dictionary literal to a weak variable; object will be released after assignment}}
|
||||
z = @[ value ]; // expected-warning {{assigning array literal to a weak variable; object will be released after assignment}}
|
||||
b = ^() {}; // expected-warning {{assigning block literal to a weak variable; object will be released after assignment}}
|
||||
e = @(42); // expected-warning {{assigning boxed expression to a weak variable; object will be released after assignment}}
|
||||
n = @42; // expected-warning {{assigning numeric literal to a weak variable; object will be released after assignment}}
|
||||
e = @(42); // expected-warning {{assigning numeric literal to a weak variable; object will be released after assignment}}
|
||||
m = @(41 + 1); // expected-warning {{assigning boxed expression to a weak variable; object will be released after assignment}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue