@@ -254,7 +254,15 @@ class GenericSignatureBuilder {
254
254
255
255
// / Add the requirements placed on the given type parameter
256
256
// / to the given potential archetype.
257
+ // /
258
+ // / \param dependentType A dependent type thar describes \c pa relative to
259
+ // / its protocol, for protocol requirements.
260
+ // /
261
+ // / FIXME: \c dependentType will be derivable from \c parentSource and \c pa
262
+ // / when we're no longer putting conformance requirements directly on the
263
+ // / representative.
257
264
bool addInheritedRequirements (TypeDecl *decl, PotentialArchetype *pa,
265
+ Type dependentType,
258
266
const RequirementSource *parentSource,
259
267
llvm::SmallPtrSetImpl<ProtocolDecl *> &visited);
260
268
@@ -526,7 +534,9 @@ class GenericSignatureBuilder::RequirementSource final
526
534
527
535
// / The requirement is a protocol requirement.
528
536
// /
529
- // / This stores the protocol that introduced the requirement.
537
+ // / This stores the protocol that introduced the requirement as well as the
538
+ // / dependent type (relative to that protocol) to which the conformance
539
+ // / appertains.
530
540
ProtocolRequirement,
531
541
532
542
// / A requirement that was resolved via a superclass requirement.
@@ -554,7 +564,7 @@ class GenericSignatureBuilder::RequirementSource final
554
564
// / The kind of storage we have.
555
565
enum class StorageKind : uint8_t {
556
566
RootArchetype,
557
- ProtocolDecl ,
567
+ StoredType ,
558
568
ProtocolConformance,
559
569
AssociatedTypeDecl,
560
570
};
@@ -570,8 +580,8 @@ class GenericSignatureBuilder::RequirementSource final
570
580
// / The root archetype.
571
581
PotentialArchetype *rootArchetype;
572
582
573
- // / The protocol being described .
574
- ProtocolDecl *protocol ;
583
+ // / The type to which a requirement applies .
584
+ TypeBase *type ;
575
585
576
586
// / A protocol conformance used to satisfy the requirement.
577
587
ProtocolConformance *conformance;
@@ -586,12 +596,12 @@ class GenericSignatureBuilder::RequirementSource final
586
596
size_t numTrailingObjects (OverloadToken<ProtocolDecl *>) const {
587
597
switch (kind) {
588
598
case RequirementSignatureSelf:
599
+ case ProtocolRequirement:
589
600
return 1 ;
590
601
591
602
case Explicit:
592
603
case Inferred:
593
604
case NestedTypeNameMatch:
594
- case ProtocolRequirement:
595
605
case Superclass:
596
606
case Parent:
597
607
case Concrete:
@@ -606,9 +616,11 @@ class GenericSignatureBuilder::RequirementSource final
606
616
return hasTrailingWrittenRequirementLoc ? 1 : 0 ;
607
617
}
608
618
619
+ #ifndef NDEBUG
609
620
// / Determines whether we have been provided with an acceptable storage kind
610
621
// / for the given requirement source kind.
611
622
static bool isAcceptableStorageKind (Kind kind, StorageKind storageKind);
623
+ #endif
612
624
613
625
// / Retrieve the opaque storage as a single pointer, for use in uniquing.
614
626
const void *getOpaqueStorage1 () const ;
@@ -664,9 +676,9 @@ class GenericSignatureBuilder::RequirementSource final
664
676
}
665
677
666
678
RequirementSource (Kind kind, const RequirementSource *parent,
667
- ProtocolDecl *protocol,
679
+ Type type, ProtocolDecl *protocol,
668
680
WrittenRequirementLoc writtenReqLoc)
669
- : kind(kind), storageKind(StorageKind::ProtocolDecl ),
681
+ : kind(kind), storageKind(StorageKind::StoredType ),
670
682
hasTrailingWrittenRequirementLoc(!writtenReqLoc.isNull()),
671
683
672
684
parent(parent) {
@@ -675,7 +687,9 @@ class GenericSignatureBuilder::RequirementSource final
675
687
assert (isAcceptableStorageKind (kind, storageKind) &&
676
688
" RequirementSource kind/storageKind mismatch" );
677
689
678
- storage.protocol = protocol;
690
+ storage.type = type.getPointer ();
691
+ if (kind == ProtocolRequirement)
692
+ getTrailingObjects<ProtocolDecl *>()[0 ] = protocol;
679
693
if (hasTrailingWrittenRequirementLoc)
680
694
getTrailingObjects<WrittenRequirementLoc>()[0 ] = writtenReqLoc;
681
695
}
@@ -734,8 +748,9 @@ class GenericSignatureBuilder::RequirementSource final
734
748
private:
735
749
// / A requirement source that describes that a requirement comes from a
736
750
// / requirement of the given protocol described by the parent.
737
- const RequirementSource *viaAbstractProtocolRequirement (
751
+ const RequirementSource *viaProtocolRequirement (
738
752
GenericSignatureBuilder &builder,
753
+ Type dependentType,
739
754
ProtocolDecl *protocol,
740
755
WrittenRequirementLoc writtenLoc =
741
756
WrittenRequirementLoc ()) const ;
@@ -880,7 +895,7 @@ class GenericSignatureBuilder::FloatingRequirementSource {
880
895
struct {
881
896
ProtocolDecl *protocol = nullptr ;
882
897
WrittenRequirementLoc written;
883
- } abstractProtocolReq ;
898
+ } protocolReq ;
884
899
885
900
FloatingRequirementSource (Kind kind, Storage storage)
886
901
: kind(kind), storage(storage) { }
@@ -907,27 +922,28 @@ class GenericSignatureBuilder::FloatingRequirementSource {
907
922
return { Inferred, typeRepr };
908
923
}
909
924
910
- static FloatingRequirementSource viaAbstractProtocolRequirement (
925
+ static FloatingRequirementSource viaProtocolRequirement (
911
926
const RequirementSource *base,
912
927
ProtocolDecl *inProtocol) {
913
928
FloatingRequirementSource result{ AbstractProtocol, base };
914
- result.abstractProtocolReq .protocol = inProtocol;
929
+ result.protocolReq .protocol = inProtocol;
915
930
return result;
916
931
}
917
932
918
- static FloatingRequirementSource viaAbstractProtocolRequirement (
933
+ static FloatingRequirementSource viaProtocolRequirement (
919
934
const RequirementSource *base,
920
935
ProtocolDecl *inProtocol,
921
936
WrittenRequirementLoc written) {
922
937
FloatingRequirementSource result{ AbstractProtocol, base };
923
- result.abstractProtocolReq .protocol = inProtocol;
924
- result.abstractProtocolReq .written = written;
938
+ result.protocolReq .protocol = inProtocol;
939
+ result.protocolReq .written = written;
925
940
return result;
926
941
}
927
942
928
943
// / Retrieve the complete requirement source rooted at the given potential
929
944
// / archetype.
930
- const RequirementSource *getSource (PotentialArchetype *pa) const ;
945
+ const RequirementSource *getSource (PotentialArchetype *pa,
946
+ Type dependentType) const ;
931
947
932
948
// / Retrieve the source location for this requirement.
933
949
SourceLoc getLoc () const ;
0 commit comments