https://github.com/YutongZhuu updated 
https://github.com/llvm/llvm-project/pull/139429

>From e9e4634fa153a82a750360f0d41c65e2bfdf70cd Mon Sep 17 00:00:00 2001
From: Yutong Zhu <y25...@uwaterloo.ca>
Date: Thu, 15 May 2025 17:41:21 -0400
Subject: [PATCH 1/2] Separate implicit int conversion on negation sign to new
 diagnostic group

---
 clang/include/clang/Basic/DiagnosticGroups.td    |  4 +++-
 clang/include/clang/Basic/DiagnosticSemaKinds.td |  3 +++
 clang/lib/Sema/SemaChecking.cpp                  |  5 +++++
 clang/test/Sema/implicit-int-conversion-on-int.c | 12 ++++++++++++
 4 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Sema/implicit-int-conversion-on-int.c

diff --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index d97bbfee2e4d5..4ea8143438474 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -110,9 +110,11 @@ def DeprecatedOFast : DiagGroup<"deprecated-ofast">;
 def ObjCSignedCharBoolImplicitIntConversion :
   DiagGroup<"objc-signed-char-bool-implicit-int-conversion">;
 def Shorten64To32 : DiagGroup<"shorten-64-to-32">;
+def ImplicitIntConversionOnNegation : 
DiagGroup<"implicit-int-conversion-on-negation">;
 def ImplicitIntConversion : DiagGroup<"implicit-int-conversion",
                                      [Shorten64To32,
-                                      
ObjCSignedCharBoolImplicitIntConversion]>;
+                                      ObjCSignedCharBoolImplicitIntConversion,
+                                      ImplicitIntConversionOnNegation]>;
 def ImplicitConstIntFloatConversion : 
DiagGroup<"implicit-const-int-float-conversion">;
 def ImplicitIntFloatConversion : DiagGroup<"implicit-int-float-conversion",
  [ImplicitConstIntFloatConversion]>;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 180ca39bc07e9..d315f056e54e7 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -4217,6 +4217,9 @@ def warn_impcast_integer_sign_conditional : Warning<
 def warn_impcast_integer_precision : Warning<
   "implicit conversion loses integer precision: %0 to %1">,
   InGroup<ImplicitIntConversion>, DefaultIgnore;
+def warn_impcast_integer_precision_on_negation : Warning<
+  "implicit conversion loses integer precision: %0 to %1 on negation">,
+  InGroup<ImplicitIntConversionOnNegation>, DefaultIgnore;
 def warn_impcast_high_order_zero_bits : Warning<
   "higher order bits are zeroes after implicit conversion">,
   InGroup<ImplicitIntConversion>, DefaultIgnore;
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index bffd0dd461d3d..3b9f72f6c7499 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -12091,6 +12091,11 @@ void Sema::CheckImplicitConversion(Expr *E, QualType 
T, SourceLocation CC,
     if (SourceMgr.isInSystemMacro(CC))
       return;
 
+    if (const auto *UO = dyn_cast<UnaryOperator>(E)) {
+      return DiagnoseImpCast(*this, E, T, CC,
+                             diag::warn_impcast_integer_precision_on_negation);
+    }
+
     if (TargetRange.Width == 32 && Context.getIntWidth(E->getType()) == 64)
       return DiagnoseImpCast(*this, E, T, CC, diag::warn_impcast_integer_64_32,
                              /* pruneControlFlow */ true);
diff --git a/clang/test/Sema/implicit-int-conversion-on-int.c 
b/clang/test/Sema/implicit-int-conversion-on-int.c
new file mode 100644
index 0000000000000..e0c2f445cbaa3
--- /dev/null
+++ b/clang/test/Sema/implicit-int-conversion-on-int.c
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 %s -verify -Wimplicit-int-conversion 
+// RUN: %clang_cc1 %s -verify -Wimplicit-int-conversion 
-Wno-implicit-int-conversion-on-negation -DNO_DIAG
+
+#ifdef NO_DIAG
+unsigned char test_no_diag(unsigned char x) {
+    return -x; // expected-no-diagnostics
+}
+#else
+unsigned char test_diag(unsigned char x) {
+    return -x; // expected-warning {{implicit conversion loses integer 
precision: 'int' to 'unsigned char' on negation}}
+}
+#endif
\ No newline at end of file

>From 87247a3ab88a3b10d9537269f4536fc13cc54841 Mon Sep 17 00:00:00 2001
From: Yutong Zhu <y25...@uwaterloo.ca>
Date: Thu, 15 May 2025 19:27:36 -0400
Subject: [PATCH 2/2] Edit release notes

---
 clang/docs/ReleaseNotes.rst                      | 3 +++
 clang/test/Sema/implicit-int-conversion-on-int.c | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 11f62bc881b03..b72484a0adfe2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -352,6 +352,9 @@ Improvements to Clang's diagnostics
 - Now correctly diagnose a tentative definition of an array with static
   storage duration in pedantic mode in C. (#GH50661)
 
+- Split diagnosis of implicit integer comparison on negation to a new 
diagnostic group ``-Wimplicit-int-comparison-on-negation``, 
+  so user can turn it off independently.
+
 Improvements to Clang's time-trace
 ----------------------------------
 
diff --git a/clang/test/Sema/implicit-int-conversion-on-int.c 
b/clang/test/Sema/implicit-int-conversion-on-int.c
index e0c2f445cbaa3..633160e4d0a1b 100644
--- a/clang/test/Sema/implicit-int-conversion-on-int.c
+++ b/clang/test/Sema/implicit-int-conversion-on-int.c
@@ -9,4 +9,4 @@ unsigned char test_no_diag(unsigned char x) {
 unsigned char test_diag(unsigned char x) {
     return -x; // expected-warning {{implicit conversion loses integer 
precision: 'int' to 'unsigned char' on negation}}
 }
-#endif
\ No newline at end of file
+#endif

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to