[C++20] [Modules] Fix thread_local variable handling in modules (#189796)

Close https://github.com/llvm/llvm-project/issues/189415

The function shouldVarGenerateHereOnly should also handle thread_local
variables, not just static variables. This fixes incorrect code
generation for thread_local variables in named modules.
This commit is contained in:
Chuanqi Xu 2026-04-01 13:50:42 +08:00 committed by GitHub
parent 512071941d
commit fe6d15ddbf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 1 deletions

View File

@ -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())

View File

@ -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