Author: Chuanqi Xu Date: 2024-12-23T15:14:38+08:00 New Revision: 4b35dd57b88a59b169c3471cbc398113d3bf98e8
URL: https://github.com/llvm/llvm-project/commit/4b35dd57b88a59b169c3471cbc398113d3bf98e8 DIFF: https://github.com/llvm/llvm-project/commit/4b35dd57b88a59b169c3471cbc398113d3bf98e8.diff LOG: [Serialization] Try to clean up PendingUndeducedFunctionDecls when PendingUndeducedFunctionDecls is not empty Close https://github.com/llvm/llvm-project/issues/120277 This turns out to be a simple oversight initially. See the analysis in https://github.com/llvm/llvm-project/commit/ba1e84fb8f45e102f40f409fcfe9b420fbf9fb70 for the wider background. Added: clang/test/Modules/pr120277.cppm Modified: clang/lib/Serialization/ASTReader.cpp Removed: ################################################################################ diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 15160b0751f83b..fccd79bf745203 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -10642,7 +10642,8 @@ void ASTReader::FinishedDeserializing() { // We do this now rather than in finishPendingActions because we want to // be able to walk the complete redeclaration chains of the updated decls. while (!PendingExceptionSpecUpdates.empty() || - !PendingDeducedTypeUpdates.empty()) { + !PendingDeducedTypeUpdates.empty() || + !PendingUndeducedFunctionDecls.empty()) { auto ESUpdates = std::move(PendingExceptionSpecUpdates); PendingExceptionSpecUpdates.clear(); for (auto Update : ESUpdates) { diff --git a/clang/test/Modules/pr120277.cppm b/clang/test/Modules/pr120277.cppm new file mode 100644 index 00000000000000..a4f55ef113b2cd --- /dev/null +++ b/clang/test/Modules/pr120277.cppm @@ -0,0 +1,58 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm +// RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-module-interface -o %t/b.pcm \ +// RUN: -fprebuilt-module-path=%t +// RUN: %clang_cc1 -std=c++20 %t/c.cppm -emit-module-interface -o %t/c.pcm \ +// RUN: -fprebuilt-module-path=%t +// RUN: %clang_cc1 -std=c++20 %t/d.cppm -emit-module-interface -o %t/d.pcm \ +// RUN: -fprebuilt-module-path=%t +// RUN: %clang_cc1 -std=c++20 %t/d.pcm -emit-llvm -o %t/d.ll \ +// RUN: -fprebuilt-module-path=%t +// RUN: cat %t/d.ll | FileCheck %t/d.cppm + +//--- a.cppm +export module a; + +export template<int> +struct a { + static auto f() { + } +}; + +//--- b.cppm +export module b; + +import a; + +void b() { + a<0> t; +} + +//--- c.cppm +export module c; + +import a; + +void c() { + a<0>::f(); +} + +//--- d.cppm +export module d; + +import a; +import b; +import c; + +struct d { + static void g() { + a<0>::f(); + a<1>::f(); + } +}; + +// fine enough to check it won't crash +// CHECK: define _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits