@@ -73,6 +73,8 @@ class GenericSignatureBuilder {
73
73
74
74
class RequirementSource ;
75
75
76
+ class FloatingRequirementSource ;
77
+
76
78
// / Describes a constraint that is bounded on one side by a concrete type.
77
79
struct ConcreteConstraint {
78
80
PotentialArchetype *archetype;
@@ -166,22 +168,22 @@ class GenericSignatureBuilder {
166
168
// / previous example).
167
169
bool
168
170
addSameTypeRequirement (ResolvedType paOrT1, ResolvedType paOrT2,
169
- const RequirementSource * Source,
171
+ FloatingRequirementSource Source,
170
172
llvm::function_ref<void (Type, Type)> diagnoseMismatch);
171
173
172
174
// / \brief Add a new same-type requirement between two fully resolved types
173
175
// / (output of GenericSignatureBuilder::resolve).
174
176
// /
175
177
// / The two types must not be incompatible concrete types.
176
178
bool addSameTypeRequirement (ResolvedType paOrT1, ResolvedType paOrT2,
177
- const RequirementSource * Source);
179
+ FloatingRequirementSource Source);
178
180
179
181
// / \brief Add a new same-type requirement between two unresolved types.
180
182
// /
181
183
// / The types are resolved with \c GenericSignatureBuilder::resolve, and must
182
184
// / not be incompatible concrete types.
183
185
bool addSameTypeRequirement (UnresolvedType paOrT1, UnresolvedType paOrT2,
184
- const RequirementSource * Source);
186
+ FloatingRequirementSource Source);
185
187
186
188
// / \brief Add a new same-type requirement between two unresolved types.
187
189
// /
@@ -190,7 +192,7 @@ class GenericSignatureBuilder {
190
192
// / types.
191
193
bool
192
194
addSameTypeRequirement (UnresolvedType paOrT1, UnresolvedType paOrT2,
193
- const RequirementSource * Source,
195
+ FloatingRequirementSource Source,
194
196
llvm::function_ref<void (Type, Type)> diagnoseMismatch);
195
197
196
198
private:
@@ -218,7 +220,7 @@ class GenericSignatureBuilder {
218
220
// / \param diagnoseMismatch Callback invoked when the types in the same-type
219
221
// / requirement mismatch.
220
222
bool addSameTypeRequirementBetweenConcrete (
221
- Type T1, Type T2, const RequirementSource * Source,
223
+ Type T1, Type T2, FloatingRequirementSource Source,
222
224
llvm::function_ref<void (Type, Type)> diagnoseMismatch);
223
225
224
226
// / Add the requirements placed on the given type parameter
@@ -294,9 +296,9 @@ class GenericSignatureBuilder {
294
296
// /
295
297
// / \returns true if this requirement makes the set of requirements
296
298
// / inconsistent, in which case a diagnostic will have been issued.
297
- bool addRequirement (const Requirement &req, const RequirementSource * source);
299
+ bool addRequirement (const Requirement &req, FloatingRequirementSource source);
298
300
299
- bool addRequirement (const Requirement &req, const RequirementSource * source,
301
+ bool addRequirement (const Requirement &req, FloatingRequirementSource source,
300
302
llvm::SmallPtrSetImpl<ProtocolDecl *> &Visited);
301
303
302
304
// / \brief Add a new requirement.
@@ -596,22 +598,23 @@ class GenericSignatureBuilder::RequirementSource : public llvm::FoldingSetNode {
596
598
597
599
public:
598
600
// / Retrieve an abstract requirement source.
599
- static const RequirementSource *forAbstract (GenericSignatureBuilder &builder );
601
+ static const RequirementSource *forAbstract (PotentialArchetype *root );
600
602
601
603
// / Retrieve a requirement source representing an explicit requirement
602
604
// / stated in an 'inheritance' clause.
603
- static const RequirementSource *forExplicit (GenericSignatureBuilder &builder ,
605
+ static const RequirementSource *forExplicit (PotentialArchetype *root ,
604
606
const TypeRepr *typeRepr);
605
607
606
608
// / Retrieve a requirement source representing an explicit requirement
607
609
// / stated in an 'where' clause.
608
- static const RequirementSource *forExplicit (GenericSignatureBuilder &builder,
610
+ static const RequirementSource *forExplicit (
611
+ PotentialArchetype *root,
609
612
const RequirementRepr *requirementRepr);
610
613
611
614
// / Retrieve a requirement source representing a requirement that is
612
615
// / inferred from some part of a generic declaration's signature, e.g., the
613
616
// / parameter or result type of a generic function.
614
- static const RequirementSource *forInferred (GenericSignatureBuilder &builder ,
617
+ static const RequirementSource *forInferred (PotentialArchetype *root ,
615
618
const TypeRepr *typeRepr);
616
619
617
620
// / Retrieve a requirement source representing the requirement signature
@@ -728,6 +731,58 @@ class GenericSignatureBuilder::RequirementSource : public llvm::FoldingSetNode {
728
731
void print (llvm::raw_ostream &out, SourceManager *SrcMgr) const ;
729
732
};
730
733
734
+ // / A requirement source that potentially lacks a root \c PotentialArchetype.
735
+ // / The root will be supplied as soon as the appropriate dependent type is
736
+ // / resolved.
737
+ class GenericSignatureBuilder ::FloatingRequirementSource {
738
+ enum Kind {
739
+ // / A fully-resolved requirement source, which does not need a root.
740
+ Resolved,
741
+ // / An explicit requirement source lacking a root.
742
+ Explicit,
743
+ // / An inferred requirement source lacking a root.
744
+ Inferred
745
+ } kind;
746
+
747
+ using Storage =
748
+ llvm::PointerUnion3<const RequirementSource *, const TypeRepr *,
749
+ const RequirementRepr *>;
750
+
751
+ Storage storage;
752
+
753
+ FloatingRequirementSource (Kind kind, Storage storage)
754
+ : kind(kind), storage(storage) { }
755
+
756
+ public:
757
+ // / Implicit conversion from a resolved requirement source.
758
+ FloatingRequirementSource (const RequirementSource *source)
759
+ : FloatingRequirementSource(Resolved, source) { }
760
+
761
+ static FloatingRequirementSource forAbstract () {
762
+ return { Explicit, Storage () };
763
+ }
764
+
765
+ static FloatingRequirementSource forExplicit (const TypeRepr *typeRepr) {
766
+ return { Explicit, typeRepr };
767
+ }
768
+
769
+ static FloatingRequirementSource forExplicit (
770
+ const RequirementRepr *requirementRepr) {
771
+ return { Explicit, requirementRepr };
772
+ }
773
+
774
+ static FloatingRequirementSource forInferred (const TypeRepr *typeRepr) {
775
+ return { Inferred, typeRepr };
776
+ }
777
+
778
+ // / Retrieve the complete requirement source rooted at the given potential
779
+ // / archetype.
780
+ const RequirementSource *getSource (PotentialArchetype *pa) const ;
781
+
782
+ // / Retrieve the source location for this requirement.
783
+ SourceLoc getLoc () const ;
784
+ };
785
+
731
786
class GenericSignatureBuilder ::PotentialArchetype {
732
787
// / The parent of this potential archetype (for a nested type) or the
733
788
// / generic signature builder in which this root resides.
0 commit comments