diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-07-17 17:46:44 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-07-17 17:46:44 +0000 |
commit | eec207f02a0208814bb8b4ca90099a2fed016244 (patch) | |
tree | 863e68f346f990c98bbccb1ac11fb52579d650b5 /lib/Sema/SemaExpr.cpp | |
parent | 8d872ca7f10bb70d0757b894af79641679262bba (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.cpp | 31 |
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())) { |