Author: Volodymyr Turanskyy
Date: 2026-05-20T13:00:11+01:00
New Revision: 5b168934d72d4f7ce6177c86bfea0961a0ccc4eb

URL: 
https://github.com/llvm/llvm-project/commit/5b168934d72d4f7ce6177c86bfea0961a0ccc4eb
DIFF: 
https://github.com/llvm/llvm-project/commit/5b168934d72d4f7ce6177c86bfea0961a0ccc4eb.diff

LOG: [libc] Fix modular printf attributes (#194003)

This fixes the validation error related to modular printf missing format 
attribute in C++ code by moving the validation after the implicit format 
attribute is added for builtins and known library functions.

This also adds a simple C++ test since the C code did compile successfully 
because the implicit attributes were added in time for the validation happening 
for C code.

Assisted-by: codex, reviewed and cross checked, also tested with ATfE,
by me. Modular printf reduced code size from ~37K to ~13K for int-only
printf sample.

Added: 
    clang/test/SemaCXX/attr-modular-format.cpp

Modified: 
    clang/lib/Sema/SemaDecl.cpp
    libc/include/llvm-libc-macros/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 68b64952639af..62cb9360d1322 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -7257,7 +7257,6 @@ static void checkAttributesAfterMerging(Sema &S, 
NamedDecl &ND) {
   checkHybridPatchableAttr(S, ND);
   checkInheritableAttr(S, ND);
   checkLifetimeBoundAttr(S, ND);
-  checkModularFormatAttr(S, ND);
 }
 
 static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl,
@@ -11080,6 +11079,10 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, 
DeclContext *DC,
   checkAttributesAfterMerging(*this, *NewFD);
 
   AddKnownFunctionAttributes(NewFD);
+  // The above can add the format attribute for known builtin/library functions
+  // which is required by the modular_format attribute, thus
+  // validate modular_format now after those attributes have been added.
+  checkModularFormatAttr(*this, *NewFD);
 
   if (NewFD->hasAttr<OverloadableAttr>() &&
       !NewFD->getType()->getAs<FunctionProtoType>()) {

diff  --git a/clang/test/SemaCXX/attr-modular-format.cpp 
b/clang/test/SemaCXX/attr-modular-format.cpp
new file mode 100644
index 0000000000000..3be3e7f6e250c
--- /dev/null
+++ b/clang/test/SemaCXX/attr-modular-format.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// expected-no-diagnostics
+
+extern "C" int printf(const char *fmt, ...)
+    __attribute__((modular_format(__modular_printf, "__printf", "float")));

diff  --git a/libc/include/llvm-libc-macros/CMakeLists.txt 
b/libc/include/llvm-libc-macros/CMakeLists.txt
index 3225b5b1849a1..3472642941613 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -418,7 +418,7 @@ add_macro_header(
     sysexits-macros.h
 )
 
-if (LIBC_CONF_MODULAR_FORMAT)
+if (LIBC_CONF_PRINTF_MODULAR)
   add_macro_header(
     _LIBC_MODULAR_FORMAT_PRINTF
     HDR


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

Reply via email to