@@ -3600,24 +3600,27 @@ void irgen::bindFromGenericRequirementsBuffer(IRGenFunction &IGF,
3600
3600
}
3601
3601
3602
3602
// Cast if necessary.
3603
- switch (requirements[index].getKind ()) {
3604
- case GenericRequirement::Kind::Shape:
3605
- slot = IGF.Builder .CreateElementBitCast (slot, IGF.IGM .SizeTy );
3606
- break ;
3607
- case GenericRequirement::Kind::Metadata:
3608
- slot = IGF.Builder .CreateElementBitCast (slot, IGF.IGM .TypeMetadataPtrTy );
3609
- break ;
3610
- case GenericRequirement::Kind::WitnessTable:
3611
- slot = IGF.Builder .CreateElementBitCast (slot, IGF.IGM .WitnessTablePtrTy );
3612
- break ;
3613
- }
3603
+ slot = IGF.Builder .CreateElementBitCast (
3604
+ slot, requirements[index].getType (IGF.IGM ));
3614
3605
3615
3606
llvm::Value *value = IGF.Builder .CreateLoad (slot);
3616
3607
bindGenericRequirement (IGF, requirements[index], value, metadataState,
3617
3608
getInContext);
3618
3609
}
3619
3610
}
3620
3611
3612
+ llvm::Type *GenericRequirement::typeForKind (IRGenModule &IGM,
3613
+ GenericRequirement::Kind kind) {
3614
+ switch (kind) {
3615
+ case GenericRequirement::Kind::Shape:
3616
+ return IGM.SizeTy ;
3617
+ case GenericRequirement::Kind::Metadata:
3618
+ return IGM.TypeMetadataPtrTy ;
3619
+ case GenericRequirement::Kind::WitnessTable:
3620
+ return IGM.WitnessTablePtrTy ;
3621
+ }
3622
+ }
3623
+
3621
3624
void irgen::bindGenericRequirement (IRGenFunction &IGF,
3622
3625
GenericRequirement requirement,
3623
3626
llvm::Value *value,
@@ -3626,17 +3629,16 @@ void irgen::bindGenericRequirement(IRGenFunction &IGF,
3626
3629
// Get the corresponding context type.
3627
3630
auto type = getInContext (requirement.getTypeParameter ());
3628
3631
3632
+ assert (value->getType () == requirement.getType (IGF.IGM ));
3629
3633
switch (requirement.getKind ()) {
3630
3634
case GenericRequirement::Kind::Shape: {
3631
3635
assert (isa<ArchetypeType>(type));
3632
- assert (value->getType () == IGF.IGM .SizeTy );
3633
3636
auto kind = LocalTypeDataKind::forPackShapeExpression ();
3634
3637
IGF.setUnscopedLocalTypeData (type, kind, value);
3635
3638
break ;
3636
3639
}
3637
3640
3638
3641
case GenericRequirement::Kind::Metadata: {
3639
- assert (value->getType () == IGF.IGM .TypeMetadataPtrTy );
3640
3642
setTypeMetadataName (IGF.IGM , value, type);
3641
3643
IGF.bindLocalTypeDataFromTypeMetadata (type, IsExact, value, metadataState);
3642
3644
break ;
@@ -3645,7 +3647,6 @@ void irgen::bindGenericRequirement(IRGenFunction &IGF,
3645
3647
case GenericRequirement::Kind::WitnessTable: {
3646
3648
auto proto = requirement.getProtocol ();
3647
3649
assert (isa<ArchetypeType>(type));
3648
- assert (value->getType () == IGF.IGM .WitnessTablePtrTy );
3649
3650
setProtocolWitnessTableName (IGF.IGM , value, type, proto);
3650
3651
auto kind = LocalTypeDataKind::forAbstractProtocolWitnessTable (proto);
3651
3652
IGF.setUnscopedLocalTypeData (type, kind, value);
@@ -3676,17 +3677,15 @@ namespace {
3676
3677
enumerateUnfulfilledRequirements ([&](GenericRequirement reqt) {
3677
3678
if (reqs)
3678
3679
reqs->push_back (reqt);
3680
+ out.push_back (reqt.getType (IGM));
3679
3681
switch (reqt.getKind ()) {
3680
3682
case GenericRequirement::Kind::Shape:
3681
- out.push_back (IGM.SizeTy );
3682
3683
++numShapes;
3683
3684
break ;
3684
3685
case GenericRequirement::Kind::Metadata:
3685
- out.push_back (IGM.TypeMetadataPtrTy );
3686
3686
++numTypeMetadataPtrs;
3687
3687
break ;
3688
3688
case GenericRequirement::Kind::WitnessTable:
3689
- out.push_back (IGM.WitnessTablePtrTy );
3690
3689
++numWitnessTablePtrs;
3691
3690
break ;
3692
3691
}
0 commit comments