@@ -553,8 +553,8 @@ bool RequirementSource::isAcceptableStorageKind(Kind kind,
553
553
case Inferred:
554
554
case RequirementSignatureSelf:
555
555
case NestedTypeNameMatch:
556
- case ConcreteTypeBinding:
557
556
case EquivalentType:
557
+ case Layout:
558
558
switch (storageKind) {
559
559
case StorageKind::StoredType:
560
560
return true ;
@@ -599,17 +599,6 @@ bool RequirementSource::isAcceptableStorageKind(Kind kind,
599
599
case StorageKind::None:
600
600
return false ;
601
601
}
602
-
603
- case Derived:
604
- switch (storageKind) {
605
- case StorageKind::None:
606
- return true ;
607
-
608
- case StorageKind::StoredType:
609
- case StorageKind::ProtocolConformance:
610
- case StorageKind::AssociatedTypeDecl:
611
- return false ;
612
- }
613
602
}
614
603
615
604
llvm_unreachable (" Unhandled RequirementSourceKind in switch." );
@@ -659,7 +648,6 @@ bool RequirementSource::isInferredRequirement() const {
659
648
case NestedTypeNameMatch:
660
649
return true ;
661
650
662
- case ConcreteTypeBinding:
663
651
case EquivalentType:
664
652
return false ;
665
653
@@ -669,7 +657,7 @@ bool RequirementSource::isInferredRequirement() const {
669
657
case ProtocolRequirement:
670
658
case RequirementSignatureSelf:
671
659
case Superclass:
672
- case Derived :
660
+ case Layout :
673
661
break ;
674
662
}
675
663
}
@@ -690,12 +678,11 @@ bool RequirementSource::isDerivedRequirement() const {
690
678
return false ;
691
679
692
680
case NestedTypeNameMatch:
693
- case ConcreteTypeBinding:
694
681
case Parent:
695
682
case Superclass:
696
683
case Concrete:
697
684
case RequirementSignatureSelf:
698
- case Derived :
685
+ case Layout :
699
686
case EquivalentType:
700
687
return true ;
701
688
@@ -879,7 +866,7 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
879
866
880
867
case Concrete:
881
868
case Superclass:
882
- case Derived :
869
+ case Layout :
883
870
case EquivalentType:
884
871
return false ;
885
872
@@ -892,7 +879,6 @@ const RequirementSource *RequirementSource::getMinimalConformanceSource(
892
879
case Explicit:
893
880
case Inferred:
894
881
case NestedTypeNameMatch:
895
- case ConcreteTypeBinding:
896
882
rootType = parentType;
897
883
return false ;
898
884
}
@@ -1018,17 +1004,6 @@ const RequirementSource *RequirementSource::forNestedTypeNameMatch(
1018
1004
0 , WrittenRequirementLoc ());
1019
1005
}
1020
1006
1021
- const RequirementSource *RequirementSource::forConcreteTypeBinding (
1022
- GenericSignatureBuilder &builder,
1023
- Type rootType) {
1024
- REQUIREMENT_SOURCE_FACTORY_BODY (
1025
- (nodeID, ConcreteTypeBinding, nullptr ,
1026
- rootType.getPointer (), nullptr , nullptr ),
1027
- (ConcreteTypeBinding, rootType, nullptr ,
1028
- WrittenRequirementLoc ()),
1029
- 0 , WrittenRequirementLoc ());
1030
- }
1031
-
1032
1007
const RequirementSource *RequirementSource::viaProtocolRequirement (
1033
1008
GenericSignatureBuilder &builder, Type dependentType,
1034
1009
ProtocolDecl *protocol,
@@ -1077,11 +1052,13 @@ const RequirementSource *RequirementSource::viaParent(
1077
1052
0 , WrittenRequirementLoc ());
1078
1053
}
1079
1054
1080
- const RequirementSource *RequirementSource::viaDerived (
1081
- GenericSignatureBuilder &builder) const {
1055
+ const RequirementSource *RequirementSource::viaLayout (
1056
+ GenericSignatureBuilder &builder,
1057
+ Type superclass) const {
1082
1058
REQUIREMENT_SOURCE_FACTORY_BODY (
1083
- (nodeID, Derived, this , nullptr , nullptr , nullptr ),
1084
- (Derived, this ),
1059
+ (nodeID, Layout, this , superclass.getPointer (),
1060
+ nullptr , nullptr ),
1061
+ (Layout, this , superclass),
1085
1062
0 , WrittenRequirementLoc ());
1086
1063
}
1087
1064
@@ -1123,7 +1100,6 @@ const RequirementSource *RequirementSource::withoutRedundantSubpath(
1123
1100
case Inferred:
1124
1101
case RequirementSignatureSelf:
1125
1102
case NestedTypeNameMatch:
1126
- case ConcreteTypeBinding:
1127
1103
llvm_unreachable (" Subpath end doesn't occur within path" );
1128
1104
1129
1105
case ProtocolRequirement:
@@ -1142,9 +1118,9 @@ const RequirementSource *RequirementSource::withoutRedundantSubpath(
1142
1118
return parent->withoutRedundantSubpath (builder, start, end)
1143
1119
->viaConcrete (builder, getProtocolConformance ());
1144
1120
1145
- case Derived :
1121
+ case Layout :
1146
1122
return parent->withoutRedundantSubpath (builder, start, end)
1147
- ->viaDerived (builder);
1123
+ ->viaLayout (builder, getStoredType () );
1148
1124
1149
1125
case EquivalentType:
1150
1126
return parent->withoutRedundantSubpath (builder, start, end)
@@ -1199,7 +1175,6 @@ RequirementSource::visitPotentialArchetypesAlongPath(
1199
1175
}
1200
1176
1201
1177
case RequirementSource::NestedTypeNameMatch:
1202
- case RequirementSource::ConcreteTypeBinding:
1203
1178
case RequirementSource::Explicit:
1204
1179
case RequirementSource::Inferred:
1205
1180
case RequirementSource::RequirementSignatureSelf: {
@@ -1211,7 +1186,7 @@ RequirementSource::visitPotentialArchetypesAlongPath(
1211
1186
1212
1187
case RequirementSource::Concrete:
1213
1188
case RequirementSource::Superclass:
1214
- case RequirementSource::Derived :
1189
+ case RequirementSource::Layout :
1215
1190
return parent->visitPotentialArchetypesAlongPath (visitor);
1216
1191
1217
1192
case RequirementSource::EquivalentType: {
@@ -1368,10 +1343,6 @@ void RequirementSource::print(llvm::raw_ostream &out,
1368
1343
out << " Nested type match" ;
1369
1344
break ;
1370
1345
1371
- case RequirementSource::ConcreteTypeBinding:
1372
- out << " Concrete type binding" ;
1373
- break ;
1374
-
1375
1346
case Parent:
1376
1347
out << " Parent" ;
1377
1348
break ;
@@ -1392,8 +1363,8 @@ void RequirementSource::print(llvm::raw_ostream &out,
1392
1363
out << " Superclass" ;
1393
1364
break ;
1394
1365
1395
- case Derived :
1396
- out << " Derived " ;
1366
+ case Layout :
1367
+ out << " Layout " ;
1397
1368
break ;
1398
1369
1399
1370
case EquivalentType:
@@ -1561,12 +1532,11 @@ bool FloatingRequirementSource::isExplicit() const {
1561
1532
case RequirementSource::Explicit:
1562
1533
case RequirementSource::Inferred:
1563
1534
case RequirementSource::NestedTypeNameMatch:
1564
- case RequirementSource::ConcreteTypeBinding:
1565
1535
case RequirementSource::Parent:
1566
1536
case RequirementSource::ProtocolRequirement:
1567
1537
case RequirementSource::InferredProtocolRequirement:
1568
1538
case RequirementSource::Superclass:
1569
- case RequirementSource::Derived :
1539
+ case RequirementSource::Layout :
1570
1540
case RequirementSource::EquivalentType:
1571
1541
return false ;
1572
1542
}
@@ -1585,10 +1555,9 @@ bool FloatingRequirementSource::isExplicit() const {
1585
1555
case RequirementSource::RequirementSignatureSelf:
1586
1556
case RequirementSource::Concrete:
1587
1557
case RequirementSource::NestedTypeNameMatch:
1588
- case RequirementSource::ConcreteTypeBinding:
1589
1558
case RequirementSource::Parent:
1590
1559
case RequirementSource::Superclass:
1591
- case RequirementSource::Derived :
1560
+ case RequirementSource::Layout :
1592
1561
case RequirementSource::EquivalentType:
1593
1562
return false ;
1594
1563
}
@@ -4278,14 +4247,15 @@ bool GenericSignatureBuilder::updateSuperclass(
4278
4247
// Presence of a superclass constraint implies a _Class layout
4279
4248
// constraint.
4280
4249
auto layoutReqSource =
4281
- source.getSource (*this , type)->viaDerived (*this );
4282
- addLayoutRequirementDirect (type,
4283
- LayoutConstraint::getLayoutConstraint (
4284
- superclass->getClassOrBoundGenericClass ()->isObjC ()
4285
- ? LayoutConstraintKind::Class
4286
- : LayoutConstraintKind::NativeClass,
4287
- getASTContext ()),
4288
- layoutReqSource);
4250
+ source.getSource (*this , type)->viaLayout (*this , superclass);
4251
+
4252
+ auto layout =
4253
+ LayoutConstraint::getLayoutConstraint (
4254
+ superclass->getClassOrBoundGenericClass ()->isObjC ()
4255
+ ? LayoutConstraintKind::Class
4256
+ : LayoutConstraintKind::NativeClass,
4257
+ getASTContext ());
4258
+ addLayoutRequirementDirect (type, layout, layoutReqSource);
4289
4259
return true ;
4290
4260
}
4291
4261
@@ -6926,26 +6896,29 @@ void GenericSignatureBuilder::enumerateRequirements(
6926
6896
SmallVectorImpl<Requirement> &requirements) {
6927
6897
auto recordRequirement = [&](RequirementKind kind,
6928
6898
Type depTy,
6929
- RequirementRHS type ) {
6899
+ RequirementRHS rhs ) {
6930
6900
depTy = getSugaredDependentType (depTy, genericParams);
6931
6901
6932
- if (auto concreteTy = type .dyn_cast <Type>()) {
6933
- if (concreteTy ->hasError ())
6902
+ if (auto type = rhs .dyn_cast <Type>()) {
6903
+ if (type ->hasError ())
6934
6904
return ;
6935
6905
6936
6906
// Drop requirements involving concrete types containing
6937
6907
// unresolved associated types.
6938
- if (concreteTy ->findUnresolvedDependentMemberType ()) {
6908
+ if (type ->findUnresolvedDependentMemberType ()) {
6939
6909
assert (Impl->HadAnyError );
6940
6910
return ;
6941
6911
}
6942
6912
6943
- if (concreteTy ->isTypeParameter ())
6944
- concreteTy = getSugaredDependentType (concreteTy , genericParams);
6913
+ if (type ->isTypeParameter ())
6914
+ type = getSugaredDependentType (type , genericParams);
6945
6915
6946
- requirements.push_back (Requirement (kind, depTy, concreteTy));
6916
+ requirements.push_back (Requirement (kind, depTy, type));
6917
+ } else if (auto *proto = rhs.dyn_cast <ProtocolDecl *>()) {
6918
+ auto type = proto->getDeclaredInterfaceType ();
6919
+ requirements.push_back (Requirement (kind, depTy, type));
6947
6920
} else {
6948
- auto layoutConstraint = type .get <LayoutConstraint>();
6921
+ auto layoutConstraint = rhs .get <LayoutConstraint>();
6949
6922
requirements.push_back (Requirement (kind, depTy, layoutConstraint));
6950
6923
return ;
6951
6924
}
@@ -7079,8 +7052,7 @@ void GenericSignatureBuilder::enumerateRequirements(
7079
7052
7080
7053
// Enumerate the conformance requirements.
7081
7054
for (auto proto : protocols) {
7082
- recordRequirement (RequirementKind::Conformance, subjectType,
7083
- proto->getDeclaredInterfaceType ());
7055
+ recordRequirement (RequirementKind::Conformance, subjectType, proto);
7084
7056
}
7085
7057
}
7086
7058
0 commit comments