@@ -35,18 +35,28 @@ struct F : A {
3535
3636typedef float EmptyArrayTypedef[10 ][0 ];
3737
38- // CHECK: HLSLBufferDecl {{.*}} line:41:9 cbuffer CB
38+ struct OneFloat {
39+ float a;
40+ };
41+
42+ struct TwoFloats {
43+ float a;
44+ float b;
45+ };
46+
47+ // CHECK: HLSLBufferDecl {{.*}} line:50:9 cbuffer CB
3948// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
4049// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
4150cbuffer CB {
4251 // CHECK: VarDecl {{.*}} col:9 used a1 'float'
4352 float a1;
44- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB definition
53+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB definition
4554 // CHECK: FieldDecl {{.*}} a1 'float'
4655}
56+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_CB), "" );
4757
4858// Check that buffer layout struct does not include resources or empty types
49- // CHECK: HLSLBufferDecl {{.*}} line:52 :9 cbuffer CB
59+ // CHECK: HLSLBufferDecl {{.*}} line:62 :9 cbuffer CB
5060// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
5161// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
5262cbuffer CB {
@@ -60,13 +70,14 @@ cbuffer CB {
6070 float d2[0 ];
6171 // CHECK: VarDecl {{.*}} col:9 e2 'float'
6272 float e2;
63- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.1 definition
73+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_1 definition
6474 // CHECK: FieldDecl {{.*}} a2 'float'
6575 // CHECK-NEXT: FieldDecl {{.*}} e2 'float'
6676}
77+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_CB_1), "" );
6778
6879// Check that layout struct is created for B and the empty struct C is removed
69- // CHECK: HLSLBufferDecl {{.*}} line:72 :9 cbuffer CB
80+ // CHECK: HLSLBufferDecl {{.*}} line:83 :9 cbuffer CB
7081// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
7182// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
7283cbuffer CB {
@@ -76,47 +87,54 @@ cbuffer CB {
7687 B s2;
7788 // CHECK: VarDecl {{.*}} col:12 s3 'CTypedef':'C
7889 CTypedef s3;
79- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.B definition
90+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_B definition
8091 // CHECK: FieldDecl {{.*}} a 'float'
81- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.2 definition
92+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_2 definition
8293 // CHECK: FieldDecl {{.*}} s1 'A'
83- // CHECK: FieldDecl {{.*}} s2 '__layout.B '
94+ // CHECK: FieldDecl {{.*}} s2 '__layout_B '
8495}
96+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_B), "" );
97+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_CB_2), "" );
8598
8699// check that layout struct is created for D because of its base struct
87- // CHECK: HLSLBufferDecl {{.*}} line:90 :9 cbuffer CB
100+ // CHECK: HLSLBufferDecl {{.*}} line:103 :9 cbuffer CB
88101// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
89102// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
90103cbuffer CB {
91104 // CHECK: VarDecl {{.*}} s4 'D'
92105 D s4;
93- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.D definition
106+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_D definition
107+ // CHECK: public '__layout_B'
94108 // CHECK: FieldDecl {{.*}} b 'float'
95- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.3 definition
96- // CHECK: FieldDecl {{.*}} s4 '__layout.D '
109+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_3 definition
110+ // CHECK: FieldDecl {{.*}} s4 '__layout_D '
97111}
112+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_D), "" );
113+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_CB_3), "" );
98114
99115// check that layout struct is created for E because because its base struct
100116// is empty and should be eliminated, and BTypedef should reuse the previously
101- // defined '__layout.B '
102- // CHECK: HLSLBufferDecl {{.*}} line:105 :9 cbuffer CB
117+ // defined '__layout_B '
118+ // CHECK: HLSLBufferDecl {{.*}} line:121 :9 cbuffer CB
103119// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
104120// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
105121cbuffer CB {
106122 // CHECK: VarDecl {{.*}} s5 'E'
107123 E s5;
108124 // CHECK: VarDecl {{.*}} s6 'BTypedef':'B'
109125 BTypedef s6;
110- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.E definition
126+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_E definition
111127 // CHECK: FieldDecl {{.*}} c 'float'
112- // CHECK-NOT: CXXRecordDecl {{.*}} implicit class __layout.B definition
113- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.4 definition
114- // CHECK: FieldDecl {{.*}} s5 '__layout.E '
115- // CHECK: FieldDecl {{.*}} s6 '__layout.B '
128+ // CHECK-NOT: CXXRecordDecl {{.*}} class __layout_B definition
129+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_4 definition
130+ // CHECK: FieldDecl {{.*}} s5 '__layout_E '
131+ // CHECK: FieldDecl {{.*}} s6 '__layout_B '
116132}
133+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_E), "" );
134+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_CB_4), "" );
117135
118136// check that this produces empty layout struct
119- // CHECK: HLSLBufferDecl {{.*}} line:122 :9 cbuffer CB
137+ // CHECK: HLSLBufferDecl {{.*}} line:140 :9 cbuffer CB
120138// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
121139// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
122140cbuffer CB {
@@ -130,25 +148,27 @@ cbuffer CB {
130148 RWBuffer <float > Buf;
131149 // CHECK: VarDecl {{.*}} ea 'EmptyArrayTypedef':'float[10][0]'
132150 EmptyArrayTypedef ea;
133- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.5 definition
151+ // CHECK: CXXRecordDecl {{.*}} implicit class __layout_CB_5 definition
134152 // CHECK-NOT: FieldDecl
135153}
136154
137155// check host layout struct with compatible base struct
138- // CHECK: HLSLBufferDecl {{.*}} line:141 :9 cbuffer CB
156+ // CHECK: HLSLBufferDecl {{.*}} line:159 :9 cbuffer CB
139157// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
140158// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
141159cbuffer CB {
142160 // CHECK: VarDecl {{.*}} s8 'F'
143161 F s8;
144- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.F definition
162+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_F definition
145163 // CHECK: public 'A'
146- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.6 definition
147- // CHECK: FieldDecl {{.*}} s8 '__layout.F '
164+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_6 definition
165+ // CHECK: FieldDecl {{.*}} s8 '__layout_F '
148166}
167+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_F), "" );
168+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_CB_6), "" );
149169
150170// anonymous structs
151- // CHECK: HLSLBufferDecl {{.*}} line:154 :9 cbuffer CB
171+ // CHECK: HLSLBufferDecl {{.*}} line:174 :9 cbuffer CB
152172// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
153173// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
154174cbuffer CB {
@@ -161,23 +181,26 @@ cbuffer CB {
161181 // CHECK: FieldDecl {{.*}} f 'RWBuffer<float>':'hlsl::RWBuffer<float>'
162182 RWBuffer <float > f;
163183 } s9;
164- // CHECK: VarDecl {{.*}} s9 'struct (unnamed struct at {{.*}}cbuffer.hlsl:156 :3
184+ // CHECK: VarDecl {{.*}} s9 'struct (unnamed struct at {{.*}}cbuffer.hlsl:176 :3
165185 // CHECK: CXXRecordDecl {{.*}} struct definition
166186 struct {
167- // CHECK: FieldDecl {{.*}} g 'int '
168- int g;
187+ // CHECK: FieldDecl {{.*}} g 'float '
188+ float g;
169189 // CHECK: FieldDecl {{.*}} f 'RWBuffer<float>':'hlsl::RWBuffer<float>'
170190 RWBuffer <float > f;
171191 } s10;
172- // CHECK: VarDecl {{.*}} s10 'struct (unnamed struct at {{.*}}cbuffer.hlsl:166 :3
173- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.anon definition
192+ // CHECK: VarDecl {{.*}} s10 'struct (unnamed struct at {{.*}}cbuffer.hlsl:186 :3
193+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_anon definition
174194 // CHECK: FieldDecl {{.*}} e 'float'
175- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.anon.1 definition
176- // CHECK: FieldDecl {{.*}} g 'int '
177- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.7 definition
178- // CHECK: FieldDecl {{.*}} s9 '__layout.anon '
179- // CHECK: FieldDecl {{.*}} s10 '__layout.anon.1 '
195+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_anon_1 definition
196+ // CHECK: FieldDecl {{.*}} g 'float '
197+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_7 definition
198+ // CHECK: FieldDecl {{.*}} s9 '__layout_anon '
199+ // CHECK: FieldDecl {{.*}} s10 '__layout_anon_1 '
180200}
201+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_anon), "" );
202+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_anon_1), "" );
203+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_CB_7), "" );
181204
182205// Add uses for the constant buffer declarations so they are not optimized away
183206export float foo () {
0 commit comments