[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