Skip to content

Commit

Permalink
[Serialization] Try to clean up PendingUndeducedFunctionDecls when
Browse files Browse the repository at this point in the history
PendingUndeducedFunctionDecls is not empty

Close llvm/llvm-project#120277

This turns out to be a simple oversight initially. See the analysis in
llvm/llvm-project@ba1e84f
for the wider background.
  • Loading branch information
ChuanqiXu9 committed Dec 23, 2024
1 parent 21996bd commit 4b35dd5
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 1 deletion.
3 changes: 2 additions & 1 deletion clang/lib/Serialization/ASTReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
58 changes: 58 additions & 0 deletions clang/test/Modules/pr120277.cppm
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 4b35dd5

Please sign in to comment.