[llvm-branch-commits] [clang-tools-extra] [clang-tidy] fix wrong float to float conversion check when floating point type is not standard type (PR #122637)
Congcong Cai via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Jan 12 05:52:22 PST 2025
https://github.com/HerrCai0907 created https://github.com/llvm/llvm-project/pull/122637
compare type kind is the wrong way to compare floating point type compatibility.
more generic compatibility check is needed.
>From 31b602beadf57764e9138276cfd8b0a187ba9fb7 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Sun, 12 Jan 2025 21:47:02 +0800
Subject: [PATCH] [clang-tidy] fix wrong float to float conversion check when
floating point type is not standard type
compare type kind is the wrong way to compare floating point type compatibility.
more generic compatibility check is needed.
---
.../clang-tidy/bugprone/NarrowingConversionsCheck.cpp | 4 +++-
clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++
...rrowing-conversions-narrowingfloatingpoint-option.cpp | 9 +++++++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
index 408390ebc70b64..bafcd402ca8510 100644
--- a/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
@@ -513,7 +513,9 @@ void NarrowingConversionsCheck::handleFloatingCast(const ASTContext &Context,
return;
}
const BuiltinType *FromType = getBuiltinType(Rhs);
- if (ToType->getKind() < FromType->getKind())
+ if (!llvm::APFloatBase::isRepresentableBy(
+ Context.getFloatTypeSemantics(FromType->desugar()),
+ Context.getFloatTypeSemantics(ToType->desugar())))
diagNarrowType(SourceLoc, Lhs, Rhs);
}
}
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 835a0269a2733c..f709902cfd45e7 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -206,6 +206,11 @@ Changes in existing checks
<clang-tidy/checks/bugprone/forwarding-reference-overload>` check by fixing
a crash when determining if an ``enable_if[_t]`` was found.
+- Improve :doc:`bugprone-narrowing-conversions
+ <clang-tidy/checks/bugprone/narrowing-conversions>` to avoid incorrect check
+ results when floating point type is not ``float``, ``double`` and
+ ``long double``.
+
- Improved :doc:`bugprone-optional-value-conversion
<clang-tidy/checks/bugprone/optional-value-conversion>` to support detecting
conversion directly by ``std::make_unique`` and ``std::make_shared``.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions-narrowingfloatingpoint-option.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions-narrowingfloatingpoint-option.cpp
index 9ded2f0923f4e6..180b789e45bb37 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions-narrowingfloatingpoint-option.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions-narrowingfloatingpoint-option.cpp
@@ -36,6 +36,15 @@ void narrow_double_to_float_not_ok(double d) {
f = narrow_double_to_float_return();
}
+float narrow_float16_to_float_return(_Float16 f) {
+ return f;
+}
+
+_Float16 narrow_float_to_float16_return(float f) {
+ return f;
+ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: narrowing conversion from 'float' to '_Float16' [bugprone-narrowing-conversions]
+}
+
void narrow_fp_constants() {
float f;
f = 0.5; // [dcl.init.list] 7.2 : in-range fp constant to narrower float is not a narrowing.
More information about the llvm-branch-commits
mailing list