diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-01-12 10:48:03 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-01-12 10:48:03 +0000 |
commit | 569ad73d6b64cc7b5ed9340e5246f10fbaaf1da9 (patch) | |
tree | 78206d8f7bfea5a4ac9bf8be793c5cdbd04835c5 /clang/lib/Analysis/ReachableCode.cpp | |
parent | 4294de3aa08bf135d192a2911fc52590cda17124 (diff) | |
download | llvm-569ad73d6b64cc7b5ed9340e5246f10fbaaf1da9.zip llvm-569ad73d6b64cc7b5ed9340e5246f10fbaaf1da9.tar.gz llvm-569ad73d6b64cc7b5ed9340e5246f10fbaaf1da9.tar.bz2 |
Avoid multiple -Wunreachable-code diagnostics that are triggered by
the same source range and use the unary operator fixit only when it
actually silences the warning.
rdar://24570531
Differential Revision: https://reviews.llvm.org/D28231
llvm-svn: 291757
Diffstat (limited to 'clang/lib/Analysis/ReachableCode.cpp')
-rw-r--r-- | clang/lib/Analysis/ReachableCode.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/clang/lib/Analysis/ReachableCode.cpp b/clang/lib/Analysis/ReachableCode.cpp index 69d000c0..a2f3203 100644 --- a/clang/lib/Analysis/ReachableCode.cpp +++ b/clang/lib/Analysis/ReachableCode.cpp @@ -218,11 +218,21 @@ static bool isConfigurationValue(const Stmt *S, } case Stmt::UnaryOperatorClass: { const UnaryOperator *UO = cast<UnaryOperator>(S); - if (SilenceableCondVal) - *SilenceableCondVal = UO->getSourceRange(); - return UO->getOpcode() == UO_LNot && - isConfigurationValue(UO->getSubExpr(), PP, SilenceableCondVal, - IncludeIntegers, WrappedInParens); + if (UO->getOpcode() != UO_LNot) + return false; + bool SilenceableCondValNotSet = + SilenceableCondVal && SilenceableCondVal->getBegin().isInvalid(); + bool IsSubExprConfigValue = + isConfigurationValue(UO->getSubExpr(), PP, SilenceableCondVal, + IncludeIntegers, WrappedInParens); + // Update the silenceable condition value source range only if the range + // was set directly by the child expression. + if (SilenceableCondValNotSet && + SilenceableCondVal->getBegin().isValid() && + *SilenceableCondVal == + UO->getSubExpr()->IgnoreCasts()->getSourceRange()) + *SilenceableCondVal = UO->getSourceRange(); + return IsSubExprConfigValue; } default: return false; |