diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 7646d5d5efe0..e415ac1e4786 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -361,7 +361,8 @@ namespace clang { // compilation of that unit, not by its users. (Inline variables are still // emitted in module users.) static bool shouldVarGenerateHereOnly(const VarDecl *VD) { - if (VD->getStorageDuration() != SD_Static) + if (VD->getStorageDuration() != SD_Static && + VD->getStorageDuration() != SD_Thread) return false; if (VD->getDescribedVarTemplate()) diff --git a/clang/test/Modules/pr189415.cppm b/clang/test/Modules/pr189415.cppm new file mode 100644 index 000000000000..86c66124a618 --- /dev/null +++ b/clang/test/Modules/pr189415.cppm @@ -0,0 +1,34 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/counter.cppm -triple %itanium_abi_triple \ +// RUN: -emit-reduced-module-interface -o %t/counter.pcm +// RUN: %clang_cc1 -std=c++20 %t/user.cpp -triple %itanium_abi_triple -fprebuilt-module-path=%t \ +// RUN: -disable-llvm-passes -emit-llvm -o - | FileCheck %s + +//--- counter.cppm +export module counter; + +namespace counter { + +// Works without thread_local or with inline keyword +thread_local int next = 1; + +export inline auto get_next() noexcept -> int +{ + return next++; +} + +} + +//--- user.cpp +import counter; + +auto user() -> int +{ + return counter::get_next(); +} + +// CHECK: @_ZN7counterW7counter4nextE = external {{.*}}thread_local {{.*}}global +