@@ -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) {
@@ -1135,8 +1126,7 @@ SILCloner<ImplClass>::visitAllocExistentialBoxInst(
1135
1126
auto origExistentialType = Inst->getExistentialType ();
1136
1127
auto origFormalType = Inst->getFormalConcreteType ();
1137
1128
1138
- auto conformances = getOpConformances (origFormalType,
1139
- Inst->getConformances ());
1129
+ auto conformances = getOpConformances (Inst->getConformances ());
1140
1130
1141
1131
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
1142
1132
recordClonedInstruction (
@@ -2659,29 +2649,28 @@ SILCloner<ImplClass>::visitObjCSuperMethodInst(ObjCSuperMethodInst *Inst) {
2659
2649
template <typename ImplClass>
2660
2650
void
2661
2651
SILCloner<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 ());
2665
2654
2666
2655
if (conformance.isConcrete ()) {
2667
- CanType Ty = conformance.getConcrete ()->getType ()->getCanonicalType ();
2656
+ auto conformingType = conformance.getConcrete ()->getType ()->getCanonicalType ();
2668
2657
2669
- if (Ty != newLookupType ) {
2658
+ if (conformingType != lookupType ) {
2670
2659
assert (
2671
- (Ty ->isExactSuperclassOf (newLookupType ) ||
2660
+ (conformingType ->isExactSuperclassOf (lookupType ) ||
2672
2661
getBuilder ().getModule ().Types .getLoweredRValueType (
2673
- getBuilder ().getTypeExpansionContext (), Ty ) == newLookupType ) &&
2662
+ getBuilder ().getTypeExpansionContext (), conformingType ) == lookupType ) &&
2674
2663
" Should only create upcasts for sub class." );
2675
2664
2676
2665
// We use the super class as the new look up type.
2677
- newLookupType = Ty ;
2666
+ lookupType = conformingType ;
2678
2667
}
2679
2668
}
2680
2669
2681
2670
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2682
2671
recordClonedInstruction (Inst,
2683
2672
getBuilder ().createWitnessMethod (
2684
- getOpLocation (Inst->getLoc ()), newLookupType ,
2673
+ getOpLocation (Inst->getLoc ()), lookupType ,
2685
2674
conformance, Inst->getMember (), getOpType (Inst->getType ())));
2686
2675
}
2687
2676
@@ -2790,8 +2779,7 @@ void
2790
2779
SILCloner<ImplClass>::visitInitExistentialAddrInst(InitExistentialAddrInst *Inst) {
2791
2780
CanType origFormalType = Inst->getFormalConcreteType ();
2792
2781
2793
- auto conformances = getOpConformances (origFormalType,
2794
- Inst->getConformances ());
2782
+ auto conformances = getOpConformances (Inst->getConformances ());
2795
2783
2796
2784
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2797
2785
recordClonedInstruction (
@@ -2806,8 +2794,7 @@ void SILCloner<ImplClass>::visitInitExistentialValueInst(
2806
2794
InitExistentialValueInst *Inst) {
2807
2795
CanType origFormalType = Inst->getFormalConcreteType ();
2808
2796
2809
- auto conformances = getOpConformances (origFormalType,
2810
- Inst->getConformances ());
2797
+ auto conformances = getOpConformances (Inst->getConformances ());
2811
2798
2812
2799
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2813
2800
recordClonedInstruction (
@@ -2821,9 +2808,7 @@ template<typename ImplClass>
2821
2808
void
2822
2809
SILCloner<ImplClass>::
2823
2810
visitInitExistentialMetatypeInst (InitExistentialMetatypeInst *Inst) {
2824
- auto origFormalType = Inst->getFormalErasedObjectType ();
2825
- auto conformances = getOpConformances (origFormalType,
2826
- Inst->getConformances ());
2811
+ auto conformances = getOpConformances (Inst->getConformances ());
2827
2812
2828
2813
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2829
2814
recordClonedInstruction (Inst, getBuilder ().createInitExistentialMetatype (
@@ -2837,8 +2822,7 @@ void
2837
2822
SILCloner<ImplClass>::
2838
2823
visitInitExistentialRefInst (InitExistentialRefInst *Inst) {
2839
2824
CanType origFormalType = Inst->getFormalConcreteType ();
2840
- auto conformances = getOpConformances (origFormalType,
2841
- Inst->getConformances ());
2825
+ auto conformances = getOpConformances (Inst->getConformances ());
2842
2826
2843
2827
getBuilder ().setCurrentDebugScope (getOpScope (Inst->getDebugScope ()));
2844
2828
recordClonedInstruction (
0 commit comments