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 | ea70bf71547b9c8d96735707541e55fe117e23b5 (patch) | |
| tree | 4d5f161cadc8ae02a1bf04949bcf4750727d3cc3 /clang/lib/Sema | |
| parent | 7660f78fb95b3e1706019dce7cd4e845f262c018 (diff) | |
| download | bcm5719-llvm-ea70bf71547b9c8d96735707541e55fe117e23b5.tar.gz bcm5719-llvm-ea70bf71547b9c8d96735707541e55fe117e23b5.zip | |
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.)
llvm-svn: 160378
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0548cccd1fe..fabd673d1b1 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/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())) { |

