@@ -3382,8 +3382,29 @@ Sema::SpecialMemberOverloadResult
33823382Sema::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