@@ -98,6 +98,15 @@ enum IsTrivial_t : bool {
9898 IsTrivial = true
9999};
100100
101+ // / Is a lowered SIL type the Builtin.RawPointer or a struct/tuple/enum which
102+ // / contains a Builtin.RawPointer?
103+ // / HasRawPointer is true only for types that are known to contain
104+ // / Builtin.RawPointer. It is not assumed true for generic or resilient types.
105+ enum HasRawPointer_t : bool {
106+ DoesNotHaveRawPointer = false ,
107+ HasRawPointer = true
108+ };
109+
101110// / Is a lowered SIL type fixed-ABI? That is, can the current context
102111// / assign it a fixed size and alignment and perform value operations on it
103112// / (such as copies, destroys, constructions, and projections) without
@@ -172,6 +181,7 @@ class TypeLowering {
172181 ResilientFlag = 1 << 3 ,
173182 TypeExpansionSensitiveFlag = 1 << 4 ,
174183 InfiniteFlag = 1 << 5 ,
184+ HasRawPointerFlag = 1 << 6 ,
175185 };
176186
177187 uint8_t Flags;
@@ -184,12 +194,14 @@ class TypeLowering {
184194 IsTrivial_t isTrivial, IsFixedABI_t isFixedABI,
185195 IsAddressOnly_t isAddressOnly, IsResilient_t isResilient,
186196 IsTypeExpansionSensitive_t isTypeExpansionSensitive =
187- IsNotTypeExpansionSensitive)
197+ IsNotTypeExpansionSensitive,
198+ HasRawPointer_t hasRawPointer = DoesNotHaveRawPointer)
188199 : Flags((isTrivial ? 0U : NonTrivialFlag) |
189200 (isFixedABI ? 0U : NonFixedABIFlag) |
190201 (isAddressOnly ? AddressOnlyFlag : 0U ) |
191202 (isResilient ? ResilientFlag : 0U ) |
192- (isTypeExpansionSensitive ? TypeExpansionSensitiveFlag : 0U )) {}
203+ (isTypeExpansionSensitive ? TypeExpansionSensitiveFlag : 0U ) |
204+ (hasRawPointer ? HasRawPointerFlag : 0U )) {}
193205
194206 constexpr bool operator ==(RecursiveProperties p) const {
195207 return Flags == p.Flags ;
@@ -199,6 +211,11 @@ class TypeLowering {
199211 return {IsTrivial, IsFixedABI, IsNotAddressOnly, IsNotResilient};
200212 }
201213
214+ static constexpr RecursiveProperties forRawPointer () {
215+ return {IsTrivial, IsFixedABI, IsNotAddressOnly, IsNotResilient,
216+ IsNotTypeExpansionSensitive, HasRawPointer};
217+ }
218+
202219 static constexpr RecursiveProperties forReference () {
203220 return {IsNotTrivial, IsFixedABI, IsNotAddressOnly, IsNotResilient};
204221 }
@@ -219,6 +236,9 @@ class TypeLowering {
219236 IsTrivial_t isTrivial () const {
220237 return IsTrivial_t ((Flags & NonTrivialFlag) == 0 );
221238 }
239+ IsTrivial_t isOrContainsRawPointer () const {
240+ return IsTrivial_t ((Flags & HasRawPointerFlag) != 0 );
241+ }
222242 IsFixedABI_t isFixedABI () const {
223243 return IsFixedABI_t ((Flags & NonFixedABIFlag) == 0 );
224244 }
@@ -315,6 +335,10 @@ class TypeLowering {
315335 return Properties.isTrivial ();
316336 }
317337
338+ bool isOrContainsRawPointer () const {
339+ return Properties.isOrContainsRawPointer ();
340+ }
341+
318342 // / Returns true if the type is a scalar reference-counted reference, which
319343 // / can be retained and released.
320344 bool isReferenceCounted () const {
0 commit comments