[clang] [clang] Detect int-to-float narrowing when the back-conversion is unspecified (PR #157174)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 5 13:55:01 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (camc)
<details>
<summary>Changes</summary>
Resolves #<!-- -->157067
---
Full diff: https://github.com/llvm/llvm-project/pull/157174.diff
2 Files Affected:
- (modified) clang/lib/Sema/SemaOverload.cpp (+6-4)
- (modified) clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp (+2)
``````````diff
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 14fa8478fe317..71d23906f2b17 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -412,10 +412,12 @@ NarrowingKind StandardConversionSequence::getNarrowingKind(
// And back.
llvm::APSInt ConvertedValue = *IntConstantValue;
bool ignored;
- Result.convertToInteger(ConvertedValue,
- llvm::APFloat::rmTowardZero, &ignored);
- // If the resulting value is different, this was a narrowing conversion.
- if (*IntConstantValue != ConvertedValue) {
+ llvm::APFloat::opStatus fs = Result.convertToInteger(
+ ConvertedValue, llvm::APFloat::rmTowardZero, &ignored);
+ // If the converted-back integer has unspecified value, or if the
+ // resulting value is different, this was a narrowing conversion.
+ if (fs == llvm::APFloat::opInvalidOp ||
+ *IntConstantValue != ConvertedValue) {
ConstantValue = APValue(*IntConstantValue);
ConstantType = Initializer->getType();
return NK_Constant_Narrowing;
diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp
index 2bceb3e267790..0d389cce19818 100644
--- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp
@@ -137,6 +137,8 @@ void int_to_float() {
Agg<float> f7 = {12345678}; // OK (exactly fits in a float)
Agg<float> f8 = {EnumVal}; // OK
Agg<float> f9 = {123456789}; // expected-error {{ cannot be narrowed }} expected-note {{silence}}
+ Agg<float> f10 = {2147483646} // expected-error {{constant expression evaluates to 2147483646 which cannot be narrowed to type 'float'}} expected-note {{silence}}
+ Agg<float> f11 = {2147483647} // expected-error {{constant expression evaluates to 2147483647 which cannot be narrowed to type 'float'}} expected-note {{silence}}
Agg<float> ce1 = { Convert<int>(123456789) }; // expected-error {{constant expression evaluates to 123456789 which cannot be narrowed to type 'float'}} expected-note {{silence}}
Agg<double> ce2 = { ConvertVar<long long>() }; // expected-error {{non-constant-expression cannot be narrowed from type 'long long' to 'double'}} expected-note {{silence}}
``````````
</details>
https://github.com/llvm/llvm-project/pull/157174
More information about the cfe-commits
mailing list