diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 353a58507cb2b1..c117a29723a777 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -1037,8 +1037,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) { if (D->getStorageDuration() == SD_Static) { bool ModulesCodegen = false; if (Writer.WritingModule && - !D->getDescribedVarTemplate() && !D->getMemberSpecializationInfo() && - !isa(D)) { + !D->getDescribedVarTemplate() && !D->getMemberSpecializationInfo()) { // When building a C++20 module interface unit or a partition unit, a // strong definition in the module interface is provided by the // compilation of that unit, not by its users. (Inline variables are still diff --git a/clang/test/Modules/pr59780.cppm b/clang/test/Modules/pr59780.cppm new file mode 100644 index 00000000000000..9578325b976bac --- /dev/null +++ b/clang/test/Modules/pr59780.cppm @@ -0,0 +1,46 @@ +// https://github.com/llvm/llvm-project/issues/59780 +// +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/a.cppm -triple %itanium_abi_triple -emit-module-interface -o %t/a.pcm +// RUN: %clang_cc1 -std=c++20 %t/use.cpp -fprebuilt-module-path=%t -S \ +// RUN: -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %t/use.cpp +// RUN: %clang_cc1 -std=c++20 %t/a.pcm -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %t/a.cppm + +//--- a.cppm +export module a; + +export template +int x = 0; + +export template<> +int x = 0; + +export template +struct Y { + static int value; +}; + +template +int Y::value = 0; + +export template<> +struct Y { + static int value; +}; + +int Y::value = 0; + +// CHECK-NOT: @_ZW1a1xIiE = {{.*}}available_externally{{.*}}global +// CHECK-NOT: @_ZNW1a1YIiE5valueE = {{.*}}available_externally{{.*}}global + +//--- use.cpp +import a; +int foo() { + return x + Y::value; +} + +// CHECK: @_ZW1a1xIiE = {{.*}}available_externally{{.*}}global +// CHECK: @_ZNW1a1YIiE5valueE = {{.*}}available_externally{{.*}}global