summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2014-11-14 17:12:50 +0000
committerFariborz Jahanian <fjahanian@apple.com>2014-11-14 17:12:50 +0000
commitb7859ddf9bdc2b8ef689036fadb4501cf22d79f4 (patch)
tree520645c32bb4333a17b241f5700b6dc15959556d /clang/lib/Sema/SemaChecking.cpp
parentdf8f2a23cbaf0ff16cdc9d98fba10dc2b323985c (diff)
downloadbcm5719-llvm-b7859ddf9bdc2b8ef689036fadb4501cf22d79f4.tar.gz
bcm5719-llvm-b7859ddf9bdc2b8ef689036fadb4501cf22d79f4.zip
[Sema]. Warn when logical expression is a pointer
which evaluates to true. rdar://18716393. Reviewed by Richard Trieu llvm-svn: 222009
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index ea4f3476b6c..31b643f1385 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6559,6 +6559,13 @@ void AnalyzeImplicitConversions(Sema &S, Expr *OrigE, SourceLocation CC) {
continue;
AnalyzeImplicitConversions(S, ChildExpr, CC);
}
+ if (BO && BO->isLogicalOp()) {
+ S.CheckBoolLikeConversion(BO->getLHS(), BO->getLHS()->getExprLoc());
+ S.CheckBoolLikeConversion(BO->getRHS(), BO->getRHS()->getExprLoc());
+ }
+ if (const UnaryOperator *U = dyn_cast<UnaryOperator>(E))
+ if (U->getOpcode() == UO_LNot)
+ S.CheckBoolLikeConversion(U->getSubExpr(), CC);
}
} // end anonymous namespace
@@ -6617,6 +6624,18 @@ static bool IsInAnyMacroBody(const SourceManager &SM, SourceLocation Loc) {
return false;
}
+/// CheckBoolLikeConversion - Check conversion of given expression to boolean.
+/// Input argument E is a logical expression.
+static void CheckBoolLikeConversion(Sema &S, Expr *E, SourceLocation CC) {
+ if (S.getLangOpts().Bool)
+ return;
+ CheckImplicitConversion(S, E->IgnoreParenImpCasts(), S.Context.BoolTy, CC);
+}
+
+void Sema::CheckBoolLikeConversion(Expr *E, SourceLocation CC) {
+ ::CheckBoolLikeConversion(*this, E, CC);
+}
+
/// \brief Diagnose pointers that are always non-null.
/// \param E the expression containing the pointer
/// \param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is
OpenPOWER on IntegriCloud