Skip to content

Commit fcecc8b

Browse files
Ameya Madhav Gurjar (Student)Ameya Madhav Gurjar (Student)
authored andcommitted
Fix crash when doing special member lookup on forward-declared classes
1 parent 5f69d68 commit fcecc8b

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

clang/lib/Sema/SemaLookup.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3382,8 +3382,29 @@ Sema::SpecialMemberOverloadResult
33823382
Sema::LookupSpecialMember(CXXRecordDecl *RD, CXXSpecialMemberKind SM,
33833383
bool ConstArg, bool VolatileArg, bool RValueThis,
33843384
bool ConstThis, bool VolatileThis) {
3385-
assert(CanDeclareSpecialMemberFunction(RD) &&
3386-
"doing special member lookup into record that isn't fully complete");
3385+
3386+
if (!CanDeclareSpecialMemberFunction(RD)) {
3387+
3388+
llvm::FoldingSetNodeID ID;
3389+
ID.AddPointer(RD);
3390+
ID.AddInteger(llvm::to_underlying(SM));
3391+
ID.AddInteger(ConstArg);
3392+
ID.AddInteger(VolatileArg);
3393+
ID.AddInteger(RValueThis);
3394+
ID.AddInteger(ConstThis);
3395+
ID.AddInteger(VolatileThis);
3396+
void *InsertPoint;
3397+
3398+
SpecialMemberOverloadResultEntry* Result = BumpAlloc.Allocate<SpecialMemberOverloadResultEntry>();
3399+
Result = new (Result) SpecialMemberOverloadResultEntry(ID);
3400+
Result->setMethod(nullptr);
3401+
Result->setKind(SpecialMemberOverloadResult::NoMemberOrDeleted);
3402+
SpecialMemberCache.InsertNode(Result, InsertPoint);
3403+
return *Result;
3404+
}
3405+
3406+
// assert(CanDeclareSpecialMemberFunction(RD) &&
3407+
// "doing special member lookup into record that isn't fully complete");
33873408
RD = RD->getDefinition();
33883409
if (RValueThis || ConstThis || VolatileThis)
33893410
assert((SM == CXXSpecialMemberKind::CopyAssignment ||

0 commit comments

Comments
 (0)