diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2016-02-04 10:57:25 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2016-02-04 11:04:04 +0100 |
commit | 39accf65cdfd62693d2b46b822215d88b462c2f3 (patch) | |
tree | 9ae66c4d3307d579d61522f8d92fd306b0efd2c3 /compilerplugins/clang | |
parent | 7b0b9da7cb9a342c060666ea9d60bca700e25359 (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/clang')
-rw-r--r-- | compilerplugins/clang/fpcomparison.cxx | 12 |
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) { |