diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 8bde18f64f80b..1daf5da51548e 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -3386,8 +3386,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(); + 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 ||