https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/106501
>From b5bb3c27c13f1d0f6af21e5f7d8fdad3727bf2d0 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu <yedeng...@linux.alibaba.com> Date: Thu, 29 Aug 2024 14:40:50 +0800 Subject: [PATCH 1/2] [C++20] [Modules] Don't insert class not in named modules to PendingEmittingVTables Close https://github.com/llvm/llvm-project/issues/102933 The root cause of the issue is an oversight in https://github.com/llvm/llvm-project/pull/102287 that I didn't notice that PendingEmittingVTables should only accept classes in named modules. --- clang/include/clang/Serialization/ASTWriter.h | 4 +- clang/lib/Serialization/ASTWriter.cpp | 3 ++ clang/test/Modules/pr106483.cppm | 39 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 clang/test/Modules/pr106483.cppm diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index a4cc95cd1373fa..10a50b711043a8 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -500,8 +500,8 @@ class ASTWriter : public ASTDeserializationListener, std::vector<SourceRange> NonAffectingRanges; std::vector<SourceLocation::UIntTy> NonAffectingOffsetAdjustments; - /// A list of classes which need to emit the VTable in the corresponding - /// object file. + /// A list of classes in named modules which need to emit the VTable in + /// the corresponding object file. llvm::SmallVector<CXXRecordDecl *> PendingEmittingVTables; /// Computes input files that didn't affect compilation of the current module, diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 5cfb98c2a1060a..3e60f1425f88ea 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -3963,6 +3963,9 @@ void ASTWriter::WriteIdentifierTable(Preprocessor &PP, } void ASTWriter::handleVTable(CXXRecordDecl *RD) { + if (!RD->isInNamedModule()) + return; + PendingEmittingVTables.push_back(RD); } diff --git a/clang/test/Modules/pr106483.cppm b/clang/test/Modules/pr106483.cppm new file mode 100644 index 00000000000000..08f124dd0d08ca --- /dev/null +++ b/clang/test/Modules/pr106483.cppm @@ -0,0 +1,39 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++23 %t/a.cppm -emit-module-interface -o %t/a.pcm +// RUN: %clang_cc1 -std=c++23 %t/b.cppm -emit-module-interface -o %t/b.pcm \ +// RUN: -fprebuilt-module-path=%t +// RUN: %clang_cc1 -std=c++23 -fprebuilt-module-path=%t %t/b.pcm -emit-llvm \ +// RUN: -disable-llvm-passes -o - | FileCheck %t/b.cppm + +//--- a.cppm +module; + +struct base { + virtual void f() const; +}; + +inline void base::f() const { +} + +export module a; +export using ::base; + +//--- b.cppm +module; + +struct base { + virtual void f() const; +}; + +inline void base::f() const { +} + +export module b; +import a; +export using ::base; + +// We only need to check that the IR are successfully emitted instead of crash. +// CHECK: define >From e671e237a618af14bff1b3bb4e1720f3c69a297a Mon Sep 17 00:00:00 2001 From: Chuanqi Xu <yedeng...@linux.alibaba.com> Date: Thu, 29 Aug 2024 15:10:31 +0800 Subject: [PATCH 2/2] update test --- clang/test/Modules/pr106483.cppm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/test/Modules/pr106483.cppm b/clang/test/Modules/pr106483.cppm index 08f124dd0d08ca..a19316b9dd50cc 100644 --- a/clang/test/Modules/pr106483.cppm +++ b/clang/test/Modules/pr106483.cppm @@ -35,5 +35,7 @@ export module b; import a; export using ::base; +export extern "C" void func() {} + // We only need to check that the IR are successfully emitted instead of crash. -// CHECK: define +// CHECK: func _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits