@@ -57,6 +57,16 @@ struct SubstitutionMapWithLocalArchetypes {
5757
5858 return ProtocolConformanceRef (proto);
5959 }
60+
61+ void dump (llvm::raw_ostream &out) const {
62+ if (SubsMap)
63+ SubsMap->dump (out);
64+ for (auto pair : LocalArchetypeSubs) {
65+ out << " ---\n " ;
66+ pair.first ->dump (out);
67+ pair.second ->dump (out);
68+ }
69+ }
6070};
6171
6272// / SILCloner - Abstract SIL visitor which knows how to clone instructions and
@@ -231,8 +241,7 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
231241 for (auto substConf : substSubs.getConformances ()) {
232242 if (substConf.isInvalid ()) {
233243 llvm::errs () << " Invalid conformance in SIL cloner:\n " ;
234- if (Functor.SubsMap )
235- Functor.SubsMap ->dump (llvm::errs ());
244+ Functor.dump (llvm::errs ());
236245 llvm::errs () << " \n substitution map:\n " ;
237246 Subs.dump (llvm::errs ());
238247 llvm::errs () << " \n " ;
@@ -363,11 +372,10 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
363372#ifndef NDEBUG
364373 if (substConf.isInvalid ()) {
365374 llvm::errs () << " Invalid conformance in SIL cloner:\n " ;
366- if (Functor.SubsMap )
367- Functor.SubsMap ->dump (llvm::errs ());
375+ Functor.dump (llvm::errs ());
368376 llvm::errs () << " \n conformance:\n " ;
369377 conformance.dump (llvm::errs ());
370- llvm::errs () << " original type:\n " ;
378+ llvm::errs () << " \n original type:\n " ;
371379 ty.dump (llvm::errs ());
372380 abort ();
373381 }
@@ -460,8 +468,12 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
460468
461469 SILType remapType (SILType Ty) {
462470 if (Functor.SubsMap || Ty.hasLocalArchetype ()) {
471+ SubstOptions options (std::nullopt );
472+ if (!Functor.LocalArchetypeSubs .empty ())
473+ options |= SubstFlags::SubstituteLocalArchetypes;
474+
463475 Ty = Ty.subst (Builder.getModule (), Functor, Functor,
464- CanGenericSignature ());
476+ CanGenericSignature (), options );
465477 }
466478
467479 if (asImpl ().shouldSubstOpaqueArchetypes ()) {
@@ -480,8 +492,13 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
480492 }
481493
482494 CanType remapASTType (CanType ty) {
483- if (Functor.SubsMap || ty->hasLocalArchetype ())
484- ty = ty.subst (Functor, Functor)->getCanonicalType ();
495+ if (Functor.SubsMap || ty->hasLocalArchetype ()) {
496+ SubstOptions options (std::nullopt );
497+ if (!Functor.LocalArchetypeSubs .empty ())
498+ options |= SubstFlags::SubstituteLocalArchetypes;
499+
500+ ty = ty.subst (Functor, Functor, options)->getCanonicalType ();
501+ }
485502
486503 if (asImpl ().shouldSubstOpaqueArchetypes ()) {
487504 auto context = getBuilder ().getTypeExpansionContext ();
@@ -500,9 +517,13 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
500517
501518 ProtocolConformanceRef remapConformance (Type Ty, ProtocolConformanceRef C) {
502519 if (Functor.SubsMap || Ty->hasLocalArchetype ()) {
503- C = C.subst (Ty, Functor, Functor);
520+ SubstOptions options (std::nullopt );
521+ if (!Functor.LocalArchetypeSubs .empty ())
522+ options |= SubstFlags::SubstituteLocalArchetypes;
523+
524+ C = C.subst (Ty, Functor, Functor, options);
504525 if (asImpl ().shouldSubstOpaqueArchetypes ())
505- Ty = Ty.subst (Functor, Functor);
526+ Ty = Ty.subst (Functor, Functor, options );
506527 }
507528
508529 if (asImpl ().shouldSubstOpaqueArchetypes ()) {
@@ -520,8 +541,13 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
520541
521542 SubstitutionMap remapSubstitutionMap (SubstitutionMap Subs) {
522543 // If we have local archetypes to substitute, do so now.
523- if (Subs.getRecursiveProperties ().hasLocalArchetype () || Functor.SubsMap )
524- Subs = Subs.subst (Functor, Functor);
544+ if (Subs.getRecursiveProperties ().hasLocalArchetype () || Functor.SubsMap ) {
545+ SubstOptions options (std::nullopt );
546+ if (!Functor.LocalArchetypeSubs .empty ())
547+ options |= SubstFlags::SubstituteLocalArchetypes;
548+
549+ Subs = Subs.subst (Functor, Functor, options);
550+ }
525551
526552 if (asImpl ().shouldSubstOpaqueArchetypes ()) {
527553 auto context = getBuilder ().getTypeExpansionContext ();
0 commit comments