Author: Chuanqi Xu Date: 2024-08-29T15:42:57+08:00 New Revision: 47615ff2347a8be429404285de3b1c03b411e7af
URL: https://github.com/llvm/llvm-project/commit/47615ff2347a8be429404285de3b1c03b411e7af DIFF: https://github.com/llvm/llvm-project/commit/47615ff2347a8be429404285de3b1c03b411e7af.diff LOG: [C++20] [Modules] Don't insert class not in named modules to PendingEmittingVTables (#106501) 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. Added: clang/test/Modules/pr106483.cppm Modified: clang/include/clang/Serialization/ASTWriter.h clang/lib/Serialization/ASTWriter.cpp Removed: ################################################################################ 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..a19316b9dd50cc --- /dev/null +++ b/clang/test/Modules/pr106483.cppm @@ -0,0 +1,41 @@ +// 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; + +export extern "C" void func() {} + +// We only need to check that the IR are successfully emitted instead of crash. +// CHECK: func _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits