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\agurj...@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 ||

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to