11// RUN: %empty-directory(%t)
2- // RUN: %target- swift-frontend -emit-ir -o - %s -module-name test \
2+ // RUN: %swift-frontend -emit-ir -o - %s -module-name test \
33// RUN: -enable-experimental-feature NonescapableTypes \
44// RUN: -parse-as-library \
55// RUN: -enable-library-evolution \
6- // RUN: > %t/test.irgen
6+ // RUN: -target %target-cpu-apple-macosx15 \
7+ // RUN: > %t/test_new.irgen
78
8- // RUN: %FileCheck %s < %t/test.irgen
9+ // RUN: %swift-frontend -emit-ir -o - %s -module-name test \
10+ // RUN: -enable-experimental-feature NonescapableTypes \
11+ // RUN: -parse-as-library \
12+ // RUN: -enable-library-evolution \
13+ // RUN: -target %target-cpu-apple-macosx14 \
14+ // RUN: > %t/test_old.irgen
15+
16+ // RUN: %FileCheck --check-prefix=NEW %s < %t/test_new.irgen
17+ // RUN: %FileCheck --check-prefix=OLD %s < %t/test_old.irgen
918
1019// rdar://124401253
11- // REQUIRES: OS=macosx || OS=linux || OS=windows-msvc
20+ // REQUIRES: OS=macosx
1221// UNSUPPORTED: CPU=arm64e
1322
1423@frozen
@@ -28,14 +37,104 @@ public enum NeverCopyable<Wrapped: ~Copyable>: ~Copyable {
2837@frozen
2938public struct NonCopyable : ~ Copyable { }
3039
31- // CHECK: @"$s4test1CCMF" =
32- // CHECK-SAME: @"symbolic _____yxG 4test21ConditionallyCopyableOAARi_zrlE"
33- // CHECK-SAME: @"get_type_metadata Ri_zl4test21ConditionallyCopyableOyAA03NonC0VG.3"
34- // CHECK-SAME: @"symbolic _____yxG 4test21ConditionallyCopyableOAARi_zrlE"
35- // CHECK-SAME: @"get_type_metadata Ri_zl4test21ConditionallyCopyableOyAA03NonC0VG.3"
36- public class C < T: ~ Copyable> {
40+ // HINT: when debugging this test, you can look for an `i32 2` field in the
41+ // 'MF' constant as a separator that precedes each field descriptor.
42+
43+ // NEW: @"$s4test8CC_TestsCMF" =
44+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyxG.3"
45+ // NEW-SAME: @"symbolic _____yq_G 4test21ConditionallyCopyableOAARi_zrlE"
46+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyAA03NonC0VG.4"
47+ // NEW-SAME: @"symbolic _____ySSG 4test21ConditionallyCopyableOAARi_zrlE"
48+
49+ // OLD: @"$s4test8CC_TestsCMF" =
50+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyxG.3"
51+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyq_G.4"
52+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOyAA03NonC0VG.5"
53+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test21ConditionallyCopyableOySSG.6"
54+ public class CC_Tests < NCG: ~ Copyable, T> {
55+ var ccNCG : ConditionallyCopyable < NCG > = . none
3756 var ccT : ConditionallyCopyable < T > = . none
3857 var ccNC : ConditionallyCopyable < NonCopyable > = . none
39- var ncT : ConditionallyCopyable < T > = . none
40- var ncNC : ConditionallyCopyable < NonCopyable > = . none
58+ var ccC : ConditionallyCopyable < String > = . none
59+ }
60+
61+
62+ /// For the "never copyable" fields, we expect to always go through the
63+ /// type metadata accessor strategy, which is designed to hide these
64+ /// fields until a future runtime says they're safe to reflect.
65+
66+ // NEW: @"$s4test8NC_TestsCMF" =
67+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyxG.5"
68+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyq_G.6"
69+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyAA03NonC0VG.7"
70+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOySSG.8"
71+
72+ // OLD: @"$s4test8NC_TestsCMF" =
73+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyxG.7"
74+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyq_G.8"
75+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOyAA03NonC0VG.9"
76+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test13NeverCopyableOySSG.10"
77+ public class NC_Tests < NCG: ~ Copyable, T> {
78+ var ncNCG : NeverCopyable < NCG > = . none
79+ var ncT : NeverCopyable < T > = . none
80+ var ncNC : NeverCopyable < NonCopyable > = . none
81+ var ncC : NeverCopyable < String > = . none
82+ }
83+
84+
85+ // NEW: @"$s4test17StdlibTypes_TestsCMF" =
86+ // NEW-SAME: @"symbolic xSg"
87+ // NEW-SAME: @"symbolic q_Sg"
88+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableVSg.9"
89+ // NEW-SAME: @"symbolic SSSg"
90+ // NEW-SAME: @"symbolic SPyxG"
91+ // NEW-SAME: @"symbolic SPyq_G"
92+ // NEW-SAME: @"symbolic SPy_____G 4test11NonCopyableV"
93+ // NEW-SAME: @"symbolic SPySSG"
94+
95+ // OLD: @"$s4test17StdlibTypes_TestsCMF" =
96+ // OLD-SAME: @"symbolic xSg"
97+ // OLD-SAME: @"symbolic q_Sg"
98+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableVSg.11"
99+ // OLD-SAME: @"symbolic SSSg"
100+ // OLD-SAME: @"symbolic SPyxG"
101+ // OLD-SAME: @"symbolic SPyq_G"
102+ // OLD-SAME: @"symbolic SPy_____G 4test11NonCopyableV"
103+ // OLD-SAME: @"symbolic SPySSG"
104+ public class StdlibTypes_Tests < NCG: ~ Copyable, T> {
105+ var optNCG : Optional < NCG > = . none
106+ var optT : Optional < T > = . none
107+ var optNC : Optional < NonCopyable > = . none
108+ var optC : Optional < String > = . none
109+
110+ var upNCG : UnsafePointer < NCG > = . init( bitPattern: 16 ) !
111+ var upT : UnsafePointer < T > = . init( bitPattern: 32 ) !
112+ var upNC : UnsafePointer < NonCopyable > = . init( bitPattern: 64 ) !
113+ var upC : UnsafePointer < String > = . init( bitPattern: 128 ) !
114+ }
115+
116+
117+ // NEW: @"$s4test19PlainlyStored_TestsCMF" =
118+ // NEW-SAME: @"symbolic x"
119+ // NEW-SAME: @"symbolic q_"
120+ // NEW-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableV.10"
121+ // NEW-SAME: @"symbolic SS"
122+
123+ // OLD: @"$s4test19PlainlyStored_TestsCMF" =
124+ // OLD-SAME: @"symbolic x"
125+ // OLD-SAME: @"symbolic q_"
126+ // OLD-SAME: @"get_type_metadata Ri_zr0_l4test11NonCopyableV.12"
127+ // OLD-SAME: @"symbolic SS"
128+ public class PlainlyStored_Tests < NCG: ~ Copyable, T> {
129+ var ncg : NCG
130+ var t : T
131+ var concreteNC : NonCopyable
132+ var str : String
133+
134+ public init ( _ ncg: consuming NCG , _ t: T ) {
135+ self . ncg = ncg
136+ self . t = t
137+ self . concreteNC = NonCopyable ( )
138+ self . str = " "
139+ }
41140}
0 commit comments