[clang] [Clang] Separate implicit int conversion on negation sign to new diagnostic group (PR #139429)
Yutong Zhu via cfe-commits
cfe-commits at lists.llvm.org
Fri May 30 09:33:18 PDT 2025
https://github.com/YutongZhuu updated https://github.com/llvm/llvm-project/pull/139429
>From 0d2dcde90960b82364c0fa050be2a62b71d9d289 Mon Sep 17 00:00:00 2001
From: Yutong Zhu <y25zhu at uwaterloo.ca>
Date: Fri, 16 May 2025 09:17:40 -0400
Subject: [PATCH 1/4] Separate implicit int conversion on negation sign to new
diagnostic group
---
clang/docs/ReleaseNotes.rst | 3 +
clang/include/clang/Basic/DiagnosticGroups.td | 4 +-
.../clang/Basic/DiagnosticSemaKinds.td | 3 +
clang/lib/Sema/SemaChecking.cpp | 6 ++
.../Sema/implicit-int-conversion-on-int.c | 64 +++++++++++++++++++
5 files changed, 79 insertions(+), 1 deletion(-)
create mode 100644 clang/test/Sema/implicit-int-conversion-on-int.c
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/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..cc06e3506fefc 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -12091,6 +12091,12 @@ void Sema::CheckImplicitConversion(Expr *E, QualType T, SourceLocation CC,
if (SourceMgr.isInSystemMacro(CC))
return;
+ if (const auto *UO = dyn_cast<UnaryOperator>(E)) {
+ if (UO->getOpcode() == UO_Minus)
+ 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..40003f4f8ada9
--- /dev/null
+++ b/clang/test/Sema/implicit-int-conversion-on-int.c
@@ -0,0 +1,64 @@
+// RUN: %clang_cc1 %s -verify -Wimplicit-int-conversion
+// RUN: %clang_cc1 %s -verify -Wimplicit-int-conversion -Wno-implicit-int-conversion-on-negation -DNO_DIAG
+
+char test_char(char x) {
+ return -x;
+#ifndef NO_DIAG
+ // expected-warning at -2 {{implicit conversion loses integer precision}}
+#else
+ // expected-no-diagnostics
+#endif
+}
+
+unsigned char test_unsigned_char(unsigned char x) {
+ return -x;
+#ifndef NO_DIAG
+ // expected-warning at -2 {{implicit conversion loses integer precision}}
+#else
+ // expected-no-diagnostics
+#endif
+}
+
+short test_short(short x) {
+ return -x;
+#ifndef NO_DIAG
+ // expected-warning at -2 {{implicit conversion loses integer precision}}
+#else
+ // expected-no-diagnostics
+#endif
+}
+
+unsigned short test_unsigned_short(unsigned short x) {
+ return -x;
+#ifndef NO_DIAG
+ // expected-warning at -2 {{implicit conversion loses integer precision}}
+#else
+ // expected-no-diagnostics
+#endif
+}
+
+// --- int-width and wider (should NOT warn) ---
+
+int test_i(int x) {
+ return -x; // no warning
+}
+
+unsigned int test_ui(unsigned int x) {
+ return -x; // no warning
+}
+
+long test_l(long x) {
+ return -x; // no warning
+}
+
+unsigned long test_ul(unsigned long x) {
+ return -x; // no warning
+}
+
+long long test_ll(long long x) {
+ return -x; // no warning
+}
+
+unsigned long long test_ull(unsigned long long x) {
+ return -x; // no warning
+}
\ No newline at end of file
>From 20ab5707460f68f78293d1efed28a1ba915efe5e Mon Sep 17 00:00:00 2001
From: Yutong Zhu <y25zhu at uwaterloo.ca>
Date: Fri, 16 May 2025 14:19:08 -0400
Subject: [PATCH 2/4] Trivial fix
---
clang/test/Sema/implicit-int-conversion-on-int.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/Sema/implicit-int-conversion-on-int.c b/clang/test/Sema/implicit-int-conversion-on-int.c
index 40003f4f8ada9..dad7567e726ac 100644
--- a/clang/test/Sema/implicit-int-conversion-on-int.c
+++ b/clang/test/Sema/implicit-int-conversion-on-int.c
@@ -61,4 +61,4 @@ long long test_ll(long long x) {
unsigned long long test_ull(unsigned long long x) {
return -x; // no warning
-}
\ No newline at end of file
+}
>From 57a285774798075076930985f82858a401e4f4ba Mon Sep 17 00:00:00 2001
From: Yutong Zhu <y25zhu at uwaterloo.ca>
Date: Thu, 29 May 2025 22:27:54 -0400
Subject: [PATCH 3/4] Update test file and release note
---
clang/docs/ReleaseNotes.rst | 5 +-
.../Sema/implicit-int-conversion-on-int.c | 46 ++++++-------------
2 files changed, 17 insertions(+), 34 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b72484a0adfe2..a25ffd3105a5e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -352,8 +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.
+- Split diagnosis of implicit integer comparison on negation to a new
+ diagnostic group ``-Wimplicit-int-comparison-on-negation``, grouped under
+ ``-Wimplicit-int-conversion``, 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 dad7567e726ac..bb9f13be9cc4c 100644
--- a/clang/test/Sema/implicit-int-conversion-on-int.c
+++ b/clang/test/Sema/implicit-int-conversion-on-int.c
@@ -1,64 +1,46 @@
-// RUN: %clang_cc1 %s -verify -Wimplicit-int-conversion
-// RUN: %clang_cc1 %s -verify -Wimplicit-int-conversion -Wno-implicit-int-conversion-on-negation -DNO_DIAG
+// RUN: %clang_cc1 %s -verify=expected -Wimplicit-int-conversion
+// RUN: %clang_cc1 %s -verify=none -Wimplicit-int-conversion -Wno-implicit-int-conversion-on-negation
+
+// none-no-diagnostics
char test_char(char x) {
- return -x;
-#ifndef NO_DIAG
- // expected-warning at -2 {{implicit conversion loses integer precision}}
-#else
- // expected-no-diagnostics
-#endif
+ return -x; // expected-warning {{implicit conversion loses integer precision: 'int' to 'char' on negation}}
}
unsigned char test_unsigned_char(unsigned char x) {
- return -x;
-#ifndef NO_DIAG
- // expected-warning at -2 {{implicit conversion loses integer precision}}
-#else
- // expected-no-diagnostics
-#endif
+ return -x; // expected-warning {{implicit conversion loses integer precision: 'int' to 'unsigned char' on negation}}
}
short test_short(short x) {
- return -x;
-#ifndef NO_DIAG
- // expected-warning at -2 {{implicit conversion loses integer precision}}
-#else
- // expected-no-diagnostics
-#endif
+ return -x; // expected-warning {{implicit conversion loses integer precision: 'int' to 'short' on negation}}
}
unsigned short test_unsigned_short(unsigned short x) {
- return -x;
-#ifndef NO_DIAG
- // expected-warning at -2 {{implicit conversion loses integer precision}}
-#else
- // expected-no-diagnostics
-#endif
+ return -x; // expected-warning {{implicit conversion loses integer precision: 'int' to 'unsigned short' on negation}}
}
// --- int-width and wider (should NOT warn) ---
int test_i(int x) {
- return -x; // no warning
+ return -x;
}
unsigned int test_ui(unsigned int x) {
- return -x; // no warning
+ return -x;
}
long test_l(long x) {
- return -x; // no warning
+ return -x;
}
unsigned long test_ul(unsigned long x) {
- return -x; // no warning
+ return -x;
}
long long test_ll(long long x) {
- return -x; // no warning
+ return -x;
}
unsigned long long test_ull(unsigned long long x) {
- return -x; // no warning
+ return -x;
}
>From 13273f121e0e0dce85c4056e806ffd0594c5c3f3 Mon Sep 17 00:00:00 2001
From: Yutong Zhu <y25zhu at uwaterloo.ca>
Date: Fri, 30 May 2025 12:33:06 -0400
Subject: [PATCH 4/4] Add _BitInt test
---
clang/test/Sema/implicit-int-conversion-on-int.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/test/Sema/implicit-int-conversion-on-int.c b/clang/test/Sema/implicit-int-conversion-on-int.c
index bb9f13be9cc4c..f555893d9e17a 100644
--- a/clang/test/Sema/implicit-int-conversion-on-int.c
+++ b/clang/test/Sema/implicit-int-conversion-on-int.c
@@ -44,3 +44,7 @@ long long test_ll(long long x) {
unsigned long long test_ull(unsigned long long x) {
return -x;
}
+
+unsigned _BitInt(16) test_unsigned_bit_int(unsigned _BitInt(16) x) {
+ return -x;
+}
More information about the cfe-commits
mailing list