@@ -7727,6 +7727,12 @@ ClangImporter::getCXXFunctionTemplateSpecialization(SubstitutionMap subst,
77277727 assert (isa<clang::FunctionTemplateDecl>(decl->getClangDecl ()) &&
77287728 " This API should only be used with function templates." );
77297729
7730+ // If we hit some instantiation failure and expect the compiler to imminently
7731+ // terminate (with an error), return some reasonable-looking placeholder value
7732+ // in the meantime because callers expect this function to return some
7733+ // non-empty ConcreteDeclRef.
7734+ auto failurePlaceholder = [&]() { return ConcreteDeclRef (decl); };
7735+
77307736 auto *newFn =
77317737 decl->getASTContext ()
77327738 .getClangModuleLoader ()
@@ -7735,31 +7741,28 @@ ClangImporter::getCXXFunctionTemplateSpecialization(SubstitutionMap subst,
77357741 const_cast <clang::FunctionTemplateDecl *>(
77367742 cast<clang::FunctionTemplateDecl>(decl->getClangDecl ())),
77377743 subst);
7738- // We failed to specialize this function template. The compiler is going to
7739- // exit soon. Return something valid in the meantime.
77407744 if (!newFn)
7741- return ConcreteDeclRef (decl );
7745+ return failurePlaceholder ( );
77427746
77437747 auto [fnIt, inserted] =
77447748 Impl.specializedFunctionTemplates .try_emplace (newFn, nullptr );
77457749 if (!inserted)
77467750 return ConcreteDeclRef (fnIt->second );
77477751
7748- auto newDecl = cast_or_null<ValueDecl>(
7749- decl->getASTContext ().getClangModuleLoader ()->importDeclDirectly (
7750- newFn));
7752+ auto *newDecl = cast_or_null<ValueDecl>(
7753+ decl->getASTContext ().getClangModuleLoader ()->importDeclDirectly (newFn));
7754+ if (!newDecl)
7755+ return failurePlaceholder ();
77517756
7752- if (auto fn = dyn_cast<AbstractFunctionDecl>(newDecl)) {
7757+ if (auto * fn = dyn_cast<AbstractFunctionDecl>(newDecl)) {
77537758 if (!subst.empty ()) {
77547759 newDecl = rewriteIntegerTypes (subst, decl, fn);
77557760 }
77567761 }
77577762
7758- if (auto fn = dyn_cast<FuncDecl>(decl)) {
7763+ if (auto * fn = dyn_cast<FuncDecl>(decl)) {
77597764 newDecl = addThunkForDependentTypes (fn, cast<FuncDecl>(newDecl));
7760- }
77617765
7762- if (auto fn = dyn_cast<FuncDecl>(decl)) {
77637766 if (newFn->getNumParams () != fn->getParameters ()->size ()) {
77647767 newDecl = generateThunkForExtraMetatypes (subst, fn,
77657768 cast<FuncDecl>(newDecl));
0 commit comments