https://github.com/atigdng updated 
https://github.com/llvm/llvm-project/pull/235481

>From 15ede17f0f4b41748918c77a52d775ee1920abb0 Mon Sep 17 00:00:00 2001
From: atigdng <[email protected]>
Date: Sun, 25 Oct 2026 21:59:19 +0530
Subject: [PATCH] clang: Add fix-it for implicit float conversion

---
 clang/lib/Sema/SemaChecking.cpp               | 31 +++++++++++++++++--
 .../FixIt/fixit-implicit-float-conversion.c   |  9 ++++++
 .../FixIt/fixit-implicit-float-conversion.cpp |  9 ++++++
 3 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/FixIt/fixit-implicit-float-conversion.c
 create mode 100644 clang/test/FixIt/fixit-implicit-float-conversion.cpp

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 675975168e5048..22aa6b56aa8306 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -13193,8 +13193,35 @@ static void DiagnoseImpCast(Sema &S, const Expr *E, 
QualType SourceType,
                               << SourceRange(CContext));
     return;
   }
-  S.Diag(E->getExprLoc(), diag)
-    << SourceType << T << E->getSourceRange() << SourceRange(CContext);
+  if (diag == clang::diag::warn_impcast_float_precision) {
+    // Suggest explicit cast without changing the expression's intermediate
+    // calculations.
+    SmallString<32> CastBuf;
+    llvm::raw_svector_ostream CastFix(CastBuf);
+
+    // Apply cast syntax appropriate to the language.
+    CastFix << (S.LangOpts.CPlusPlus ? "static_cast<" : "(");
+    T.print(CastFix, S.Context.getPrintingPolicy());
+    CastFix << (S.LangOpts.CPlusPlus ? ">(" : ")(");
+
+    auto DB = S.Diag(E->getBeginLoc(), diag);
+    DB << SourceType << T << E->getSourceRange() << SourceRange(CContext);
+
+    // Avoid suggesting edits when either boundary comes from a macro 
expansion.
+    if (E->getBeginLoc().isValid() && E->getEndLoc().isValid() &&
+        !E->getBeginLoc().isMacroID() && !E->getEndLoc().isMacroID()) {
+      SourceLocation EndLoc = S.SourceMgr.getSpellingLoc(E->getEndLoc());
+      SourceLocation After = EndLoc.getLocWithOffset(
+          Lexer::MeasureTokenLength(EndLoc, S.SourceMgr, S.LangOpts));
+
+      // Enclose the expression in explicit cast.
+      DB << FixItHint::CreateInsertion(E->getBeginLoc(), CastFix.str())
+         << FixItHint::CreateInsertion(After, ")");
+    }
+  } else {
+    S.Diag(E->getExprLoc(), diag)
+        << SourceType << T << E->getSourceRange() << SourceRange(CContext);
+  }
 }
 
 /// Diagnose an implicit cast;  purely a helper for CheckImplicitConversion.
diff --git a/clang/test/FixIt/fixit-implicit-float-conversion.c 
b/clang/test/FixIt/fixit-implicit-float-conversion.c
new file mode 100644
index 00000000000000..7af82992edef5a
--- /dev/null
+++ b/clang/test/FixIt/fixit-implicit-float-conversion.c
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -std=c11 -Wimplicit-float-conversion -fsyntax-only \
+// RUN:   -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+
+// Issue #93288 example
+float f = 48 * (1.0 / 255.0);
+
+// CHECK: {{.*}}:5:11: warning: implicit conversion loses floating-point 
precision: 'double' to 'float'
+// CHECK: fix-it:"{{.*}}":{5:11-5:11}:"(float)("
+// CHECK-NEXT: fix-it:"{{.*}}":{5:29-5:29}:")"
diff --git a/clang/test/FixIt/fixit-implicit-float-conversion.cpp 
b/clang/test/FixIt/fixit-implicit-float-conversion.cpp
new file mode 100644
index 00000000000000..b9531b06ed63a4
--- /dev/null
+++ b/clang/test/FixIt/fixit-implicit-float-conversion.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -std=c++17 -Wimplicit-float-conversion -fsyntax-only \
+// RUN:   -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+
+// Issue #93288 example
+float f = 48 * (1.0 / 255.0);
+
+// CHECK: {{.*}}:5:11: warning: implicit conversion loses floating-point 
precision: 'double' to 'float'
+// CHECK: fix-it:"{{.*}}":{5:11-5:11}:"static_cast<float>("
+// CHECK-NEXT: fix-it:"{{.*}}":{5:29-5:29}:")"

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to