summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema
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
commitea70bf71547b9c8d96735707541e55fe117e23b5 (patch)
tree4d5f161cadc8ae02a1bf04949bcf4750727d3cc3 /clang/lib/Sema
parent7660f78fb95b3e1706019dce7cd4e845f262c018 (diff)
downloadbcm5719-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.cpp31
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())) {
OpenPOWER on IntegriCloud