[clang] Fix crash when doing special member lookup on forward-declared classes (PR #144828)
Ameya Gurjar via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 18 19:59:05 PDT 2025
https://github.com/Ameya674 created https://github.com/llvm/llvm-project/pull/144828
The compiler tends to crash when encountering a forward-declared incomplete type in Sema::LookupSpecialMember.
Fixed this by adding a check to handle the incomplete types.
The patch compiles and clang triggers the correct error message.
>From fcecc8b3ee649c735cff33ab544c4abcff282658 Mon Sep 17 00:00:00 2001
From: "Ameya Madhav Gurjar (Student)"
<ASUAD\agurjar2 at en4230612l.fulton.ad.asu.edu>
Date: Wed, 18 Jun 2025 19:24:17 -0700
Subject: [PATCH] Fix crash when doing special member lookup on
forward-declared classes
---
clang/lib/Sema/SemaLookup.cpp | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 5ad9dd8ed0d3e..bf114e5c9f996 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -3382,8 +3382,29 @@ Sema::SpecialMemberOverloadResult
Sema::LookupSpecialMember(CXXRecordDecl *RD, CXXSpecialMemberKind SM,
bool ConstArg, bool VolatileArg, bool RValueThis,
bool ConstThis, bool VolatileThis) {
- assert(CanDeclareSpecialMemberFunction(RD) &&
- "doing special member lookup into record that isn't fully complete");
+
+ if (!CanDeclareSpecialMemberFunction(RD)) {
+
+ llvm::FoldingSetNodeID ID;
+ ID.AddPointer(RD);
+ ID.AddInteger(llvm::to_underlying(SM));
+ ID.AddInteger(ConstArg);
+ ID.AddInteger(VolatileArg);
+ ID.AddInteger(RValueThis);
+ ID.AddInteger(ConstThis);
+ ID.AddInteger(VolatileThis);
+ void *InsertPoint;
+
+ SpecialMemberOverloadResultEntry* Result = BumpAlloc.Allocate<SpecialMemberOverloadResultEntry>();
+ Result = new (Result) SpecialMemberOverloadResultEntry(ID);
+ Result->setMethod(nullptr);
+ Result->setKind(SpecialMemberOverloadResult::NoMemberOrDeleted);
+ SpecialMemberCache.InsertNode(Result, InsertPoint);
+ return *Result;
+ }
+
+ // assert(CanDeclareSpecialMemberFunction(RD) &&
+ // "doing special member lookup into record that isn't fully complete");
RD = RD->getDefinition();
if (RValueThis || ConstThis || VolatileThis)
assert((SM == CXXSpecialMemberKind::CopyAssignment ||
More information about the cfe-commits
mailing list