summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2016-02-04 10:57:25 +0100
committerStephan Bergmann <sbergman@redhat.com>2016-02-04 11:04:04 +0100
commit39accf65cdfd62693d2b46b822215d88b462c2f3 (patch)
tree9ae66c4d3307d579d61522f8d92fd306b0efd2c3 /compilerplugins
parent7b0b9da7cb9a342c060666ea9d60bca700e25359 (diff)
loplugin:fpcomparison: Fix check for floating-point zero
...so that isZeroConstant doesn't trigger an assert inside Clang's isCXX11ConstantExpr when expr is sizeof(x) with x being dependent on a template argument. Change-Id: I6bab46e64cc085d597db25994d8bfdc66417fe83
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/fpcomparison.cxx12
1 files changed, 5 insertions, 7 deletions
diff --git a/compilerplugins/clang/fpcomparison.cxx b/compilerplugins/clang/fpcomparison.cxx
index b374da7a5da7..8d20b8cb6c0c 100644
--- a/compilerplugins/clang/fpcomparison.cxx
+++ b/compilerplugins/clang/fpcomparison.cxx
@@ -97,8 +97,7 @@ bool FpComparison::ignore(FunctionDecl* function)
static bool isZeroConstant(ASTContext& context, const Expr* expr)
{
- // calling isCXX11ConstantExpr with non-arithmetic types sometimes results in a crash
- if (!expr->getType()->isArithmeticType()) {
+ if (!expr->getType()->isFloatingType()) {
return false;
}
// prevent clang crash
@@ -106,12 +105,11 @@ static bool isZeroConstant(ASTContext& context, const Expr* expr)
return false;
}
APValue result;
- if (expr->isCXX11ConstantExpr(context, &result)
- && result.isFloat() && result.getFloat().isZero())
- {
- return true;
+ if (!expr->isCXX11ConstantExpr(context, &result)) {
+ return false;
}
- return false;
+ assert(result.isFloat());
+ return result.getFloat().isZero();
}
bool FpComparison::VisitBinaryOperator(const BinaryOperator* binaryOp)
{