@@ -409,32 +409,16 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
409
409
VarInfo->Scope = getOpScope (VarInfo->Scope );
410
410
}
411
411
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);
429
414
}
430
415
431
416
ArrayRef<ProtocolConformanceRef>
432
- getOpConformances (Type ty,
433
- ArrayRef<ProtocolConformanceRef> conformances) {
417
+ getOpConformances (ArrayRef<ProtocolConformanceRef> conformances) {
434
418
SmallVector<ProtocolConformanceRef, 4 > newConformances;
435
419
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);
438
422
}
439
423
440
424
bool isValueCloned (SILValue OrigValue) const {
@@ -558,28 +542,35 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
558
542
return ty;
559
543
}
560
544
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 ()) {
563
549
SubstOptions options = SubstFlags::SubstitutePrimaryArchetypes;
564
550
if (Functor.hasLocalArchetypes ())
565
551
options |= SubstFlags::SubstituteLocalArchetypes;
566
552
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 ();
570
562
}
571
563
572
564
if (asImpl ().shouldSubstOpaqueArchetypes ()) {
573
565
auto context = getBuilder ().getTypeExpansionContext ();
574
566
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
+ }
580
571
}
581
572
582
- return C ;
573
+ return substConf ;
583
574
}
584
575
585
576
SubstitutionMap remapSubstitutionMap (SubstitutionMap Subs) {
@@ -599,11 +590,7 @@ class SILCloner : protected SILInstructionVisitor<ImplClass> {
599
590
!context.shouldLookThroughOpaqueTypeArchetypes ())
600
591
return Subs;
601
592
602
- ReplaceOpaqueTypesWithUnderlyingTypes replacer (
603
- context.getContext (), context.getResilienceExpansion (),
604
- context.isWholeModuleContext ());
605
- return Subs.subst (replacer, replacer,
606
- SubstFlags::SubstituteOpaqueArchetypes);
593
+ return Subs.mapIntoTypeExpansionContext (context);
607
594
}
608
595
609
596
return Subs;
@@ -1135,8 +1122,7 @@ SILCloner<ImplClass>::visitAllocExistentialBoxInst(
1135
1122
auto origExistentialType = Inst->getExistentialType ();
1136
1123
auto origFormalType = Inst->getFormalConcreteType ();
1137
1124
1138
- auto conformances = getOpConformances (origFormalType,
1139
- Inst->getConformances ());
1125
+ auto conformances = getOpConformances (Inst->getConformances ());
1140
1126
1141
1127
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
1142
1128
recordClonedInstruction (
@@ -2659,29 +2645,28 @@ SILCloner<ImplClass>::visitObjCSuperMethodInst(ObjCSuperMethodInst *Inst) {
2659
2645
template <typename ImplClass>
2660
2646
void
2661
2647
SILCloner<ImplClass>::visitWitnessMethodInst(WitnessMethodInst *Inst) {
2662
- auto lookupType = Inst->getLookupType ();
2663
- auto conformance = getOpConformance (lookupType, Inst->getConformance ());
2664
- auto newLookupType = getOpASTType (lookupType);
2648
+ auto conformance = getOpConformance (Inst->getConformance ());
2649
+ auto lookupType = getOpASTType (Inst->getLookupType ());
2665
2650
2666
2651
if (conformance.isConcrete ()) {
2667
- CanType Ty = conformance.getConcrete ()->getType ()->getCanonicalType ();
2652
+ auto conformingType = conformance.getConcrete ()->getType ()->getCanonicalType ();
2668
2653
2669
- if (Ty != newLookupType ) {
2654
+ if (conformingType != lookupType ) {
2670
2655
assert (
2671
- (Ty ->isExactSuperclassOf (newLookupType ) ||
2656
+ (conformingType ->isExactSuperclassOf (lookupType ) ||
2672
2657
getBuilder ().getModule ().Types .getLoweredRValueType (
2673
- getBuilder ().getTypeExpansionContext (), Ty ) == newLookupType ) &&
2658
+ getBuilder ().getTypeExpansionContext (), conformingType ) == lookupType ) &&
2674
2659
" Should only create upcasts for sub class." );
2675
2660
2676
2661
// We use the super class as the new look up type.
2677
- newLookupType = Ty ;
2662
+ lookupType = conformingType ;
2678
2663
}
2679
2664
}
2680
2665
2681
2666
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2682
2667
recordClonedInstruction (Inst,
2683
2668
getBuilder ().createWitnessMethod (
2684
- getOpLocation (Inst->getLoc ()), newLookupType ,
2669
+ getOpLocation (Inst->getLoc ()), lookupType ,
2685
2670
conformance, Inst->getMember (), getOpType (Inst->getType ())));
2686
2671
}
2687
2672
@@ -2790,8 +2775,7 @@ void
2790
2775
SILCloner<ImplClass>::visitInitExistentialAddrInst(InitExistentialAddrInst *Inst) {
2791
2776
CanType origFormalType = Inst->getFormalConcreteType ();
2792
2777
2793
- auto conformances = getOpConformances (origFormalType,
2794
- Inst->getConformances ());
2778
+ auto conformances = getOpConformances (Inst->getConformances ());
2795
2779
2796
2780
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2797
2781
recordClonedInstruction (
@@ -2806,8 +2790,7 @@ void SILCloner<ImplClass>::visitInitExistentialValueInst(
2806
2790
InitExistentialValueInst *Inst) {
2807
2791
CanType origFormalType = Inst->getFormalConcreteType ();
2808
2792
2809
- auto conformances = getOpConformances (origFormalType,
2810
- Inst->getConformances ());
2793
+ auto conformances = getOpConformances (Inst->getConformances ());
2811
2794
2812
2795
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2813
2796
recordClonedInstruction (
@@ -2821,9 +2804,7 @@ template<typename ImplClass>
2821
2804
void
2822
2805
SILCloner<ImplClass>::
2823
2806
visitInitExistentialMetatypeInst (InitExistentialMetatypeInst *Inst) {
2824
- auto origFormalType = Inst->getFormalErasedObjectType ();
2825
- auto conformances = getOpConformances (origFormalType,
2826
- Inst->getConformances ());
2807
+ auto conformances = getOpConformances (Inst->getConformances ());
2827
2808
2828
2809
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2829
2810
recordClonedInstruction (Inst, getBuilder ().createInitExistentialMetatype (
@@ -2837,8 +2818,7 @@ void
2837
2818
SILCloner<ImplClass>::
2838
2819
visitInitExistentialRefInst (InitExistentialRefInst *Inst) {
2839
2820
CanType origFormalType = Inst->getFormalConcreteType ();
2840
- auto conformances = getOpConformances (origFormalType,
2841
- Inst->getConformances ());
2821
+ auto conformances = getOpConformances (Inst->getConformances ());
2842
2822
2843
2823
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2844
2824
recordClonedInstruction (
0 commit comments