@@ -409,32 +409,16 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
409409 VarInfo->Scope = getOpScope (VarInfo->Scope );
410410 }
411411
412- ProtocolConformanceRef getOpConformance (Type ty,
413- ProtocolConformanceRef conformance) {
414- auto substConf = asImpl ().remapConformance (ty, conformance);
415-
416- #ifndef NDEBUG
417- if (substConf.isInvalid ()) {
418- llvm::errs () << " Invalid conformance in SIL cloner:\n " ;
419- Functor.dump (llvm::errs ());
420- llvm::errs () << " \n conformance:\n " ;
421- conformance.dump (llvm::errs ());
422- llvm::errs () << " \n original type:\n " ;
423- ty.dump (llvm::errs ());
424- abort ();
425- }
426- #endif
427-
428- return substConf;
412+ ProtocolConformanceRef getOpConformance (ProtocolConformanceRef conformance) {
413+ return asImpl ().remapConformance (conformance);
429414 }
430415
431416 ArrayRef<ProtocolConformanceRef>
432- getOpConformances (Type ty,
433- ArrayRef<ProtocolConformanceRef> conformances) {
417+ getOpConformances (ArrayRef<ProtocolConformanceRef> conformances) {
434418 SmallVector<ProtocolConformanceRef, 4 > newConformances;
435419 for (auto conformance : conformances)
436- newConformances.push_back (getOpConformance (ty, conformance));
437- return ty-> getASTContext ().AllocateCopy (newConformances);
420+ newConformances.push_back (getOpConformance (conformance));
421+ return getBuilder (). getASTContext ().AllocateCopy (newConformances);
438422 }
439423
440424 bool isValueCloned (SILValue OrigValue) const {
@@ -558,28 +542,35 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
558542 return ty;
559543 }
560544
561- ProtocolConformanceRef remapConformance (Type Ty, ProtocolConformanceRef C) {
562- if (Functor.SubsMap || Ty->hasLocalArchetype ()) {
545+ ProtocolConformanceRef remapConformance (ProtocolConformanceRef conformance) {
546+ auto substConf = conformance;
547+
548+ if (Functor.SubsMap || substConf.getType ()->hasLocalArchetype ()) {
563549 SubstOptions options = SubstFlags::SubstitutePrimaryArchetypes;
564550 if (Functor.hasLocalArchetypes ())
565551 options |= SubstFlags::SubstituteLocalArchetypes;
566552
567- C = C.subst (Functor, Functor, options);
568- if (asImpl ().shouldSubstOpaqueArchetypes ())
569- Ty = Ty.subst (Functor, Functor, options);
553+ substConf = substConf.subst (Functor, Functor, options);
554+ }
555+
556+ if (substConf.isInvalid ()) {
557+ llvm::errs () << " Invalid substituted conformance in SIL cloner:\n " ;
558+ Functor.dump (llvm::errs ());
559+ llvm::errs () << " \n original conformance:\n " ;
560+ conformance.dump (llvm::errs ());
561+ abort ();
570562 }
571563
572564 if (asImpl ().shouldSubstOpaqueArchetypes ()) {
573565 auto context = getBuilder ().getTypeExpansionContext ();
574566
575- if (!Ty->hasOpaqueArchetype () ||
576- !context.shouldLookThroughOpaqueTypeArchetypes ())
577- return C;
578-
579- return substOpaqueTypesWithUnderlyingTypes (C, context);
567+ if (substConf.getType ()->hasOpaqueArchetype () &&
568+ context.shouldLookThroughOpaqueTypeArchetypes ()) {
569+ return substOpaqueTypesWithUnderlyingTypes (substConf, context);
570+ }
580571 }
581572
582- return C ;
573+ return substConf ;
583574 }
584575
585576 SubstitutionMap remapSubstitutionMap (SubstitutionMap Subs) {
@@ -1135,8 +1126,7 @@ SILCloner<ImplClass>::visitAllocExistentialBoxInst(
11351126 auto origExistentialType = Inst->getExistentialType ();
11361127 auto origFormalType = Inst->getFormalConcreteType ();
11371128
1138- auto conformances = getOpConformances (origFormalType,
1139- Inst->getConformances ());
1129+ auto conformances = getOpConformances (Inst->getConformances ());
11401130
11411131 getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
11421132 recordClonedInstruction (
@@ -2659,29 +2649,28 @@ SILCloner<ImplClass>::visitObjCSuperMethodInst(ObjCSuperMethodInst *Inst) {
26592649template <typename ImplClass>
26602650void
26612651SILCloner<ImplClass>::visitWitnessMethodInst(WitnessMethodInst *Inst) {
2662- auto lookupType = Inst->getLookupType ();
2663- auto conformance = getOpConformance (lookupType, Inst->getConformance ());
2664- auto newLookupType = getOpASTType (lookupType);
2652+ auto conformance = getOpConformance (Inst->getConformance ());
2653+ auto lookupType = getOpASTType (Inst->getLookupType ());
26652654
26662655 if (conformance.isConcrete ()) {
2667- CanType Ty = conformance.getConcrete ()->getType ()->getCanonicalType ();
2656+ auto conformingType = conformance.getConcrete ()->getType ()->getCanonicalType ();
26682657
2669- if (Ty != newLookupType ) {
2658+ if (conformingType != lookupType ) {
26702659 assert (
2671- (Ty ->isExactSuperclassOf (newLookupType ) ||
2660+ (conformingType ->isExactSuperclassOf (lookupType ) ||
26722661 getBuilder ().getModule ().Types .getLoweredRValueType (
2673- getBuilder ().getTypeExpansionContext (), Ty ) == newLookupType ) &&
2662+ getBuilder ().getTypeExpansionContext (), conformingType ) == lookupType ) &&
26742663 " Should only create upcasts for sub class." );
26752664
26762665 // We use the super class as the new look up type.
2677- newLookupType = Ty ;
2666+ lookupType = conformingType ;
26782667 }
26792668 }
26802669
26812670 getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
26822671 recordClonedInstruction (Inst,
26832672 getBuilder ().createWitnessMethod (
2684- getOpLocation (Inst->getLoc ()), newLookupType ,
2673+ getOpLocation (Inst->getLoc ()), lookupType ,
26852674 conformance, Inst->getMember (), getOpType (Inst->getType ())));
26862675}
26872676
@@ -2790,8 +2779,7 @@ void
27902779SILCloner<ImplClass>::visitInitExistentialAddrInst(InitExistentialAddrInst *Inst) {
27912780 CanType origFormalType = Inst->getFormalConcreteType ();
27922781
2793- auto conformances = getOpConformances (origFormalType,
2794- Inst->getConformances ());
2782+ auto conformances = getOpConformances (Inst->getConformances ());
27952783
27962784 getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
27972785 recordClonedInstruction (
@@ -2806,8 +2794,7 @@ void SILCloner<ImplClass>::visitInitExistentialValueInst(
28062794 InitExistentialValueInst *Inst) {
28072795 CanType origFormalType = Inst->getFormalConcreteType ();
28082796
2809- auto conformances = getOpConformances (origFormalType,
2810- Inst->getConformances ());
2797+ auto conformances = getOpConformances (Inst->getConformances ());
28112798
28122799 getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
28132800 recordClonedInstruction (
@@ -2821,9 +2808,7 @@ template<typename ImplClass>
28212808void
28222809SILCloner<ImplClass>::
28232810visitInitExistentialMetatypeInst (InitExistentialMetatypeInst *Inst) {
2824- auto origFormalType = Inst->getFormalErasedObjectType ();
2825- auto conformances = getOpConformances (origFormalType,
2826- Inst->getConformances ());
2811+ auto conformances = getOpConformances (Inst->getConformances ());
28272812
28282813 getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
28292814 recordClonedInstruction (Inst, getBuilder ().createInitExistentialMetatype (
@@ -2837,8 +2822,7 @@ void
28372822SILCloner<ImplClass>::
28382823visitInitExistentialRefInst (InitExistentialRefInst *Inst) {
28392824 CanType origFormalType = Inst->getFormalConcreteType ();
2840- auto conformances = getOpConformances (origFormalType,
2841- Inst->getConformances ());
2825+ auto conformances = getOpConformances (Inst->getConformances ());
28422826
28432827 getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
28442828 recordClonedInstruction (
0 commit comments