2626#include " llvm/ADT/STLExtras.h"
2727#include < optional>
2828
29+ namespace swift {
30+ class AbstractConformance ;
31+ }
32+
2933namespace llvm {
30- class raw_ostream ;
34+ class raw_ostream ;
35+
36+ template <>
37+ struct PointerLikeTypeTraits <swift::AbstractConformance *> {
38+ public:
39+ static inline void *getAsVoidPointer (swift::AbstractConformance *ptr) {
40+ return ptr;
41+ }
42+ static inline swift::AbstractConformance *getFromVoidPointer (void *ptr) {
43+ return (swift::AbstractConformance *)ptr;
44+ }
45+ enum { NumLowBitsAvailable = swift::TypeAlignInBits };
46+ };
3147}
3248
3349namespace swift {
@@ -53,22 +69,27 @@ enum class EffectKind : uint8_t;
5369// / ProtocolConformanceRef allows the efficient recovery of the protocol
5470// / even when the conformance is abstract.
5571class ProtocolConformanceRef {
56- using UnionType = llvm::PointerUnion<ProtocolDecl *,
72+ public:
73+ using UnionType = llvm::PointerUnion<AbstractConformance *,
5774 ProtocolConformance *,
5875 PackConformance *>;
76+
77+ private:
5978 UnionType Union;
6079
6180 explicit ProtocolConformanceRef (UnionType value) : Union(value) {}
6281
82+ public:
83+ ProtocolConformanceRef () : Union() {}
84+ ProtocolConformanceRef (std::nullptr_t ) : Union() {}
85+
6386 // / Create an abstract protocol conformance reference.
64- explicit ProtocolConformanceRef (ProtocolDecl *proto) : Union(proto) {
65- assert (proto != nullptr &&
87+ explicit ProtocolConformanceRef (AbstractConformance *abstract)
88+ : Union(abstract) {
89+ assert (abstract != nullptr &&
6690 " cannot construct ProtocolConformanceRef with null" );
6791 }
6892
69- public:
70- ProtocolConformanceRef () : Union() {}
71-
7293 // / Create a concrete protocol conformance reference.
7394 explicit ProtocolConformanceRef (ProtocolConformance *conf) : Union(conf) {
7495 assert (conf != nullptr &&
@@ -95,7 +116,7 @@ class ProtocolConformanceRef {
95116 explicit operator bool () const { return !isInvalid (); }
96117
97118 // / Create an abstract conformance for a type parameter or archetype.
98- static ProtocolConformanceRef forAbstract (Type subjectType ,
119+ static ProtocolConformanceRef forAbstract (Type conformingType ,
99120 ProtocolDecl *protocol);
100121
101122 bool isConcrete () const {
@@ -115,12 +136,11 @@ class ProtocolConformanceRef {
115136 }
116137
117138 bool isAbstract () const {
118- return !isInvalid () && Union.is <ProtocolDecl *>();
139+ return !isInvalid () && Union.is <AbstractConformance *>();
119140 }
120141
121- ProtocolDecl *getAbstract () const {
122- ASSERT (isAbstract ());
123- return Union.get <ProtocolDecl*>();
142+ AbstractConformance *getAbstract () const {
143+ return Union.get <AbstractConformance *>();
124144 }
125145
126146 // / Determine whether this conformance (or a conformance it depends on)
@@ -149,7 +169,7 @@ class ProtocolConformanceRef {
149169 // / The given `body` will be called on each isolated conformance. If it ever
150170 // / returns `true`, this function will abort the search and return `true`.
151171 bool forEachIsolatedConformance (
152- llvm::function_ref<bool (ProtocolConformance* )> body
172+ llvm::function_ref<bool (ProtocolConformanceRef )> body
153173 ) const ;
154174
155175 using OpaqueValue = void *;
@@ -158,8 +178,11 @@ class ProtocolConformanceRef {
158178 return ProtocolConformanceRef (UnionType::getFromOpaqueValue (value));
159179 }
160180
181+ // / Retrieve the conforming type.
182+ Type getType () const ;
183+
161184 // / Return the protocol requirement.
162- ProtocolDecl *getRequirement () const ;
185+ ProtocolDecl *getProtocol () const ;
163186
164187 // / Apply a substitution to the conforming type.
165188 ProtocolConformanceRef subst (Type origType, SubstitutionMap subMap,
@@ -240,4 +263,22 @@ SourceLoc extractNearestSourceLoc(const ProtocolConformanceRef conformanceRef);
240263
241264} // end namespace swift
242265
266+ namespace llvm {
267+ class raw_ostream ;
268+
269+ template <>
270+ struct PointerLikeTypeTraits <swift::ProtocolConformanceRef>
271+ : PointerLikeTypeTraits<swift::ProtocolConformanceRef::UnionType>
272+ {
273+ public:
274+ static inline void *getAsVoidPointer (swift::ProtocolConformanceRef ref) {
275+ return ref.getOpaqueValue ();
276+ }
277+ static inline swift::ProtocolConformanceRef getFromVoidPointer (void *ptr) {
278+ return swift::ProtocolConformanceRef::getFromOpaqueValue (ptr);
279+ }
280+ };
281+
282+ }
283+
243284#endif // LLVM_SWIFT_AST_PROTOCOLCONFORMANCEREF_H
0 commit comments