aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-07-17 17:46:44 +0000
committerJordan Rose <jordan_rose@apple.com>2012-07-17 17:46:44 +0000
commiteec207f02a0208814bb8b4ca90099a2fed016244 (patch)
tree863e68f346f990c98bbccb1ac11fb52579d650b5 /lib/Sema/SemaExpr.cpp
parent8d872ca7f10bb70d0757b894af79641679262bba (diff)
Add -Wobjc-string-compare under -Wobjc-literal-compare.
Suggested by Ted, since string literal comparison is at least slightly more sensible than comparison of runtime literals. (Ambiguous language on developer.apple.com implies that strings are guaranteed to be uniqued within a translation unit and possibly across a linked binary.) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160378 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r--lib/Sema/SemaExpr.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 0548cccd1f..fabd673d1b 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -6744,19 +6744,28 @@ static void diagnoseObjCLiteralComparison(Sema &S, SourceLocation Loc,
BinaryOperator::Opcode Opc){
Expr *Literal = (isObjCObjectLiteral(LHS) ? LHS : RHS).get();
- unsigned LiteralKind;
+ // This should be kept in sync with warn_objc_literal_comparison.
+ // LK_String should always be last, since it has its own flag.
+ enum {
+ LK_Array,
+ LK_Dictionary,
+ LK_Numeric,
+ LK_Boxed,
+ LK_String
+ } LiteralKind;
+
switch (Literal->getStmtClass()) {
case Stmt::ObjCStringLiteralClass:
// "string literal"
- LiteralKind = 0;
+ LiteralKind = LK_String;
break;
case Stmt::ObjCArrayLiteralClass:
// "array literal"
- LiteralKind = 1;
+ LiteralKind = LK_Array;
break;
case Stmt::ObjCDictionaryLiteralClass:
// "dictionary literal"
- LiteralKind = 2;
+ LiteralKind = LK_Dictionary;
break;
case Stmt::ObjCBoxedExprClass: {
Expr *Inner = cast<ObjCBoxedExpr>(Literal)->getSubExpr();
@@ -6767,20 +6776,20 @@ static void diagnoseObjCLiteralComparison(Sema &S, SourceLocation Loc,
case Stmt::ObjCBoolLiteralExprClass:
case Stmt::CXXBoolLiteralExprClass:
// "numeric literal"
- LiteralKind = 3;
+ LiteralKind = LK_Numeric;
break;
case Stmt::ImplicitCastExprClass: {
CastKind CK = cast<CastExpr>(Inner)->getCastKind();
// Boolean literals can be represented by implicit casts.
if (CK == CK_IntegralToBoolean || CK == CK_IntegralCast) {
- LiteralKind = 3;
+ LiteralKind = LK_Numeric;
break;
}
// FALLTHROUGH
}
default:
// "boxed expression"
- LiteralKind = 4;
+ LiteralKind = LK_Boxed;
break;
}
break;
@@ -6789,8 +6798,12 @@ static void diagnoseObjCLiteralComparison(Sema &S, SourceLocation Loc,
llvm_unreachable("Unknown Objective-C object literal kind");
}
- S.Diag(Loc, diag::warn_objc_literal_comparison)
- << LiteralKind << Literal->getSourceRange();
+ if (LiteralKind == LK_String)
+ S.Diag(Loc, diag::warn_objc_string_literal_comparison)
+ << Literal->getSourceRange();
+ else
+ S.Diag(Loc, diag::warn_objc_literal_comparison)
+ << LiteralKind << Literal->getSourceRange();
if (BinaryOperator::isEqualityOp(Opc) &&
hasIsEqualMethod(S, LHS.get(), RHS.get())) {