@@ -3851,13 +3851,8 @@ namespace {
3851
3851
llvm_unreachable (" Fixed class metadata cannot have missing members" );
3852
3852
}
3853
3853
3854
- void addGenericArgument (GenericRequirement requirement,
3855
- ClassDecl *forClass) {
3856
- llvm_unreachable (" Fixed class metadata cannot have generic parameters" );
3857
- }
3858
-
3859
- void addGenericWitnessTable (GenericRequirement requirement,
3860
- ClassDecl *forClass) {
3854
+ void addGenericRequirement (GenericRequirement requirement,
3855
+ ClassDecl *forClass) {
3861
3856
llvm_unreachable (" Fixed class metadata cannot have generic requirements" );
3862
3857
}
3863
3858
};
@@ -3899,16 +3894,19 @@ namespace {
3899
3894
}
3900
3895
}
3901
3896
3902
- void addGenericArgument (GenericRequirement requirement,
3903
- ClassDecl *forClass) {
3904
- // Filled in at runtime.
3905
- B.addNullPointer (IGM.TypeMetadataPtrTy );
3906
- }
3907
-
3908
- void addGenericWitnessTable (GenericRequirement requirement,
3909
- ClassDecl *forClass) {
3910
- // Filled in at runtime.
3911
- B.addNullPointer (IGM.WitnessTablePtrTy );
3897
+ void addGenericRequirement (GenericRequirement requirement,
3898
+ ClassDecl *forClass) {
3899
+ switch (requirement.getKind ()) {
3900
+ case GenericRequirement::Kind::Shape:
3901
+ B.addInt (IGM.SizeTy , 0 );
3902
+ break ;
3903
+ case GenericRequirement::Kind::Metadata:
3904
+ B.addNullPointer (IGM.TypeMetadataPtrTy );
3905
+ break ;
3906
+ case GenericRequirement::Kind::WitnessTable:
3907
+ B.addNullPointer (IGM.WitnessTablePtrTy );
3908
+ break ;
3909
+ }
3912
3910
}
3913
3911
};
3914
3912
@@ -4249,14 +4247,16 @@ namespace {
4249
4247
return emitValueWitnessTable (relativeReference);
4250
4248
}
4251
4249
4252
- void addGenericArgument (GenericRequirement requirement) {
4253
- auto t = requirement.getTypeParameter ().subst (genericSubstitutions ());
4254
- ConstantReference ref = IGM.getAddrOfTypeMetadata (
4255
- CanType (t), SymbolReferenceKind::Relative_Direct);
4256
- this ->B .add (ref.getDirectValue ());
4257
- }
4250
+ void addGenericRequirement (GenericRequirement requirement) {
4251
+ if (requirement.isMetadata ()) {
4252
+ auto t = requirement.getTypeParameter ().subst (genericSubstitutions ());
4253
+ ConstantReference ref = IGM.getAddrOfTypeMetadata (
4254
+ CanType (t), SymbolReferenceKind::Relative_Direct);
4255
+ this ->B .add (ref.getDirectValue ());
4256
+ return ;
4257
+ }
4258
4258
4259
- void addGenericWitnessTable (GenericRequirement requirement) {
4259
+ assert ( requirement. isWitnessTable ());
4260
4260
auto conformance = genericSubstitutions ().lookupConformance (
4261
4261
requirement.getTypeParameter ()->getCanonicalType (),
4262
4262
requirement.getProtocol ());
@@ -4334,14 +4334,9 @@ namespace {
4334
4334
const ClassLayout &fieldLayout)
4335
4335
: super(IGM, type, decl, B, fieldLayout), FieldLayout(fieldLayout) {}
4336
4336
4337
- void addGenericArgument (GenericRequirement requirement,
4338
- ClassDecl *theClass) {
4339
- super::addGenericArgument (requirement);
4340
- }
4341
-
4342
- void addGenericWitnessTable (GenericRequirement requirement,
4343
- ClassDecl *theClass) {
4344
- super::addGenericWitnessTable (requirement);
4337
+ void addGenericRequirement (GenericRequirement requirement,
4338
+ ClassDecl *theClass) {
4339
+ super::addGenericRequirement (requirement);
4345
4340
}
4346
4341
4347
4342
void addFieldOffsetPlaceholders (MissingMemberDecl *placeholder) {
@@ -4800,11 +4795,7 @@ namespace {
4800
4795
B.addAlignmentPadding (super::IGM.getPointerAlignment ());
4801
4796
}
4802
4797
4803
- void addGenericArgument (GenericRequirement requirement) {
4804
- llvm_unreachable (" Concrete type metadata cannot have generic parameters" );
4805
- }
4806
-
4807
- void addGenericWitnessTable (GenericRequirement requirement) {
4798
+ void addGenericRequirement (GenericRequirement requirement) {
4808
4799
llvm_unreachable (" Concrete type metadata cannot have generic requirements" );
4809
4800
}
4810
4801
@@ -5169,11 +5160,7 @@ namespace {
5169
5160
PointerAuthEntity::Special::TypeDescriptor);
5170
5161
}
5171
5162
5172
- void addGenericArgument (GenericRequirement requirement) {
5173
- llvm_unreachable (" Concrete type metadata cannot have generic parameters" );
5174
- }
5175
-
5176
- void addGenericWitnessTable (GenericRequirement requirement) {
5163
+ void addGenericRequirement (GenericRequirement requirement) {
5177
5164
llvm_unreachable (" Concrete type metadata cannot have generic requirements" );
5178
5165
}
5179
5166
0 commit comments