diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-11-14 17:12:50 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-11-14 17:12:50 +0000 |
commit | b7859ddf9bdc2b8ef689036fadb4501cf22d79f4 (patch) | |
tree | 520645c32bb4333a17b241f5700b6dc15959556d /clang/lib/Sema/SemaChecking.cpp | |
parent | df8f2a23cbaf0ff16cdc9d98fba10dc2b323985c (diff) | |
download | bcm5719-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.cpp | 19 |
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 |