diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 9ae9648f38a3b..522b8ce56c326 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -4892,8 +4892,21 @@ void ASTWriter::PrepareWritingSpecialDecls(Sema &SemaRef) { if (D->isFromASTFile()) continue; - if (GeneratingReducedBMI && D->isFromExplicitGlobalModule()) - continue; + if (GeneratingReducedBMI) { + if (D->isFromExplicitGlobalModule()) + continue; + + // Don't force emitting static entities. + // + // Technically, all static entities shouldn't be in reduced BMI. The + // language also specifies that the program exposes TU-local entities + // is ill-formed. However, in practice, there are a lot of projects + // uses `static inline` in the headers. So we can't get rid of all + // static entities in reduced BMI now. + if (auto *ND = dyn_cast(D); + ND && ND->getFormalLinkage() == Linkage::Internal) + continue; + } GetDeclRef(D); } diff --git a/clang/test/Modules/unreached-static-entities.cppm b/clang/test/Modules/unreached-static-entities.cppm new file mode 100644 index 0000000000000..10f70ae09e5a1 --- /dev/null +++ b/clang/test/Modules/unreached-static-entities.cppm @@ -0,0 +1,22 @@ +// Test that the static function only used in non-inline functions won't get emitted +// into the BMI. +// +// RUN: rm -rf %t +// RUN: mkdir -p %t +// +// RUN: %clang_cc1 -std=c++20 %s -emit-reduced-module-interface -o %t/S.pcm +// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/S.pcm > %t/S.dump +// RUN: cat %t/S.dump | FileCheck %s + +export module S; +static int static_func() { + return 43; +} + +export int func() { + return static_func(); +} + +// CHECK: