[clang] Fix crash when doing special member lookup on forward-declared classes (PR #144828)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 18 19:59:46 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Ameya Gurjar  (Ameya674)

<details>
<summary>Changes</summary>

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.

---
Full diff: https://github.com/llvm/llvm-project/pull/144828.diff


1 Files Affected:

- (modified) clang/lib/Sema/SemaLookup.cpp (+23-2) 


``````````diff
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 ||

``````````

</details>


https://github.com/llvm/llvm-project/pull/144828


More information about the cfe-commits mailing list