From: Richard Trieu Date: Wed, 19 Nov 2014 06:08:18 +0000 (+0000) Subject: Add the exception for strings in logical and expressions to -Wstring-conversion X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=791b86ec55a71659cbddc3bbaaf495c699872ddf;p=platform%2Fupstream%2Fllvm.git Add the exception for strings in logical and expressions to -Wstring-conversion for C code. llvm-svn: 222327 --- diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index aa6bf17..91ba91e 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -6613,10 +6613,17 @@ void AnalyzeImplicitConversions(Sema &S, Expr *OrigE, SourceLocation CC) { continue; AnalyzeImplicitConversions(S, ChildExpr, CC); } + if (BO && BO->isLogicalOp()) { - ::CheckBoolLikeConversion(S, BO->getLHS(), BO->getLHS()->getExprLoc()); - ::CheckBoolLikeConversion(S, BO->getRHS(), BO->getRHS()->getExprLoc()); + Expr *SubExpr = BO->getLHS()->IgnoreParenImpCasts(); + if (!IsLogicalAndOperator || !isa(SubExpr)) + ::CheckBoolLikeConversion(S, SubExpr, SubExpr->getExprLoc()); + + SubExpr = BO->getRHS()->IgnoreParenImpCasts(); + if (!IsLogicalAndOperator || !isa(SubExpr)) + ::CheckBoolLikeConversion(S, SubExpr, SubExpr->getExprLoc()); } + if (const UnaryOperator *U = dyn_cast(E)) if (U->getOpcode() == UO_LNot) ::CheckBoolLikeConversion(S, U->getSubExpr(), CC); diff --git a/clang/test/Sema/warn-string-conversion.c b/clang/test/Sema/warn-string-conversion.c new file mode 100644 index 0000000..708dd54 --- /dev/null +++ b/clang/test/Sema/warn-string-conversion.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -verify -fsyntax-only -Wstring-conversion %s + +#define assert(EXPR) (void)(EXPR); + +// Expection for common assert form. +void test1() { + assert(0 && "foo"); + assert("foo" && 0); + assert(0 || "foo"); // expected-warning {{string literal}} +} + +void test2() { + if ("hi") {} // expected-warning {{string literal}} + while ("hello") {} // expected-warning {{string literal}} + for (;"howdy";) {} // expected-warning {{string literal}} + do { } while ("hey"); // expected-warning {{string literal}} +}