[clang-tidy] Avoid float compare in bugprone-incorrect-roundings
authorPiotr Zegar <me@piotrzegar.pl>
Sat, 15 Apr 2023 08:34:04 +0000 (08:34 +0000)
committerPiotr Zegar <me@piotrzegar.pl>
Sat, 15 Apr 2023 09:09:21 +0000 (09:09 +0000)
Using APFloat to compare floating numbers instead of float/double.

Fixes: #46424

Reviewed By: carlosgalvezp

Differential Revision: https://reviews.llvm.org/D147906

clang-tools-extra/clang-tidy/bugprone/IncorrectRoundingsCheck.cpp

index beca7ae..c0f76cc 100644 (file)
@@ -17,13 +17,17 @@ using namespace clang::ast_matchers;
 
 namespace clang::tidy::bugprone {
 
+static llvm::APFloat getHalf(const llvm::fltSemantics &Semantics) {
+  return llvm::APFloat(Semantics, 1U) / llvm::APFloat(Semantics, 2U);
+}
+
 namespace {
 AST_MATCHER(FloatingLiteral, floatHalf) {
-  const auto &Literal = Node.getValue();
+  const llvm::APFloat Literal = Node.getValue();
   if ((&Node.getSemantics()) == &llvm::APFloat::IEEEsingle())
-    return Literal.convertToFloat() == 0.5f;
+    return Literal == getHalf(llvm::APFloat::IEEEsingle());
   if ((&Node.getSemantics()) == &llvm::APFloat::IEEEdouble())
-    return Literal.convertToDouble() == 0.5;
+    return Literal == getHalf(llvm::APFloat::IEEEdouble());
   return false;
 }
 } // namespace