Author: Chuanqi Xu Date: 2026-04-01T05:50:42Z New Revision: fe6d15ddbfd44d4a95fd2d292b1b0b431377a0dd
URL: https://github.com/llvm/llvm-project/commit/fe6d15ddbfd44d4a95fd2d292b1b0b431377a0dd DIFF: https://github.com/llvm/llvm-project/commit/fe6d15ddbfd44d4a95fd2d292b1b0b431377a0dd.diff LOG: [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. Added: clang/test/Modules/pr189415.cppm Modified: clang/lib/Serialization/ASTWriterDecl.cpp Removed: ################################################################################ diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 7646d5d5efe00b..e415ac1e478628 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 00000000000000..86c66124a618e4 --- /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 + _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
