Skip to content

Conversation

yicuixi
Copy link
Contributor

@yicuixi yicuixi commented Oct 6, 2025

Fixes #161075. This patch follow the changes in #150962, and fix a crash issue when -Wformat-signedness was specificed.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Oct 6, 2025
@llvmbot
Copy link
Member

llvmbot commented Oct 6, 2025

@llvm/pr-subscribers-clang

Author: None (yicuixi)

Changes

Fixes #161075


Full diff: https://github.com/llvm/llvm-project/pull/162049.diff

3 Files Affected:

  • (modified) clang/docs/ReleaseNotes.rst (+2)
  • (modified) clang/lib/Sema/SemaChecking.cpp (+3-1)
  • (added) clang/test/Sema/format-strings-signedness.cpp (+30)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 46d56bb3f07f5..7952cbcad0dfc 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -366,6 +366,7 @@ Bug Fixes in This Version
 - Fixed an assertion when an improper use of the ``malloc`` attribute targeting
   a function without arguments caused us to try to access a non-existent argument.
   (#GH159080)
+- Fixed clang crash that caused by missing diagnostic argument. (#GH161072)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -417,6 +418,7 @@ Bug Fixes to C++ Support
   ``__builtin_addressof``, and related issues with builtin arguments. (#GH154034)
 - Fix an assertion failure when taking the address on a non-type template parameter argument of
   object type. (#GH151531)
+- Fix an assertion failure of format string signedness check when ``-Wformat-signedness`` (#GH161075).
 
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 00f40cfa910d2..91834d430c987 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -8634,8 +8634,10 @@ CheckPrintfHandler::checkFormatExpr(const analyze_printf::PrintfSpecifier &FS,
       case ArgType::Match:
       case ArgType::MatchPromotion:
       case ArgType::NoMatchPromotionTypeConfusion:
-      case ArgType::NoMatchSignedness:
         llvm_unreachable("expected non-matching");
+      case ArgType::NoMatchSignedness:
+        Diag = diag::warn_format_conversion_argument_type_mismatch_signedness;
+        break;
       case ArgType::NoMatchPedantic:
         Diag = diag::warn_format_conversion_argument_type_mismatch_pedantic;
         break;
diff --git a/clang/test/Sema/format-strings-signedness.cpp b/clang/test/Sema/format-strings-signedness.cpp
new file mode 100644
index 0000000000000..66bf1de1ec09a
--- /dev/null
+++ b/clang/test/Sema/format-strings-signedness.cpp
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -verify -Wformat -Wformat-signedness %s
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -verify -Wformat -Wformat-signedness %s
+
+// Verify that -Wformat-signedness alone (without -Wformat) trigger the
+// warnings. Note in gcc this will not trigger the signedness warnings as
+// -Wformat is default off in gcc.
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -verify -Wformat-signedness %s
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -verify -Wformat-signedness %s
+
+// Verify that -Wformat-signedness warnings are not reported with only -Wformat
+// (gcc compat).
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -Wformat -verify=okay %s
+
+// Verify that -Wformat-signedness with -Wno-format are not reported (gcc compat).
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -Wformat-signedness -Wno-format -verify=okay %s
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -Wno-format -Wformat-signedness -verify=okay %s
+// okay-no-diagnostics
+
+// Ignore 'GCC requires a function with the 'format' attribute to be variadic'.
+#pragma GCC diagnostic ignored "-Wgcc-compat"
+namespace GH161075 {
+template <typename... Args>
+void format(const char *fmt, Args &&...args)
+    __attribute__((format(printf, 1, 2)));
+
+void do_format() {
+  bool b = false;
+  format("%hhi %hhu %hi %hu %i %u", b, b, b, b, b, b);  // expected-warning {{format specifies type 'unsigned char' but the argument has type 'bool', which differs in signedness}}
+}
+} // namespace GH161075

@tbaederr tbaederr requested review from erichkeane and cor3ntin and removed request for erichkeane October 6, 2025 09:23
@zwuis zwuis changed the title [clang] Don't crash when -Wformat-sgnedness specified [clang] Don't crash when -Wformat-signedness specified Oct 6, 2025
Copy link
Contributor

@yronglin yronglin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

``__builtin_addressof``, and related issues with builtin arguments. (#GH154034)
- Fix an assertion failure when taking the address on a non-type template parameter argument of
object type. (#GH151531)
- Fix an assertion failure of format string signedness check when ``-Wformat-signedness`` (#GH161075).
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought that the report said this is trunk only? If this hasn't been released, teh release note isn't really meaningful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[clang] expected non-matching UNREACHABLE executed at /root/llvm-project/llvm/tools/clang/lib/Sema/SemaChecking.cpp:8812!
4 participants