@@ -35,18 +35,28 @@ struct F : A {
35
35
36
36
typedef float EmptyArrayTypedef[10 ][0 ];
37
37
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
39
48
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
40
49
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
41
50
cbuffer CB {
42
51
// CHECK: VarDecl {{.*}} col:9 used a1 'float'
43
52
float a1;
44
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB definition
53
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB definition
45
54
// CHECK: FieldDecl {{.*}} a1 'float'
46
55
}
56
+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (OneFloat, __layout_CB), "" );
47
57
48
58
// 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
50
60
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
51
61
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
52
62
cbuffer CB {
@@ -60,13 +70,14 @@ cbuffer CB {
60
70
float d2[0 ];
61
71
// CHECK: VarDecl {{.*}} col:9 e2 'float'
62
72
float e2;
63
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.1 definition
73
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_1 definition
64
74
// CHECK: FieldDecl {{.*}} a2 'float'
65
75
// CHECK-NEXT: FieldDecl {{.*}} e2 'float'
66
76
}
77
+ _Static_assert (__builtin_hlsl_is_scalarized_layout_compatible (TwoFloats, __layout_CB_1), "" );
67
78
68
79
// 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
70
81
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
71
82
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
72
83
cbuffer CB {
@@ -76,47 +87,54 @@ cbuffer CB {
76
87
B s2;
77
88
// CHECK: VarDecl {{.*}} col:12 s3 'CTypedef':'C
78
89
CTypedef s3;
79
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.B definition
90
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_B definition
80
91
// CHECK: FieldDecl {{.*}} a 'float'
81
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.2 definition
92
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_CB_2 definition
82
93
// CHECK: FieldDecl {{.*}} s1 'A'
83
- // CHECK: FieldDecl {{.*}} s2 '__layout.B '
94
+ // CHECK: FieldDecl {{.*}} s2 '__layout_B '
84
95
}
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), "" );
85
98
86
99
// 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
88
101
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
89
102
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
90
103
cbuffer CB {
91
104
// CHECK: VarDecl {{.*}} s4 'D'
92
105
D s4;
93
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.D definition
106
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_D definition
107
+ // CHECK: public '__layout_B'
94
108
// 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 '
97
111
}
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), "" );
98
114
99
115
// check that layout struct is created for E because because its base struct
100
116
// 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
103
119
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
104
120
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
105
121
cbuffer CB {
106
122
// CHECK: VarDecl {{.*}} s5 'E'
107
123
E s5;
108
124
// CHECK: VarDecl {{.*}} s6 'BTypedef':'B'
109
125
BTypedef s6;
110
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.E definition
126
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_E definition
111
127
// 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 '
116
132
}
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), "" );
117
135
118
136
// check that this produces empty layout struct
119
- // CHECK: HLSLBufferDecl {{.*}} line:122 :9 cbuffer CB
137
+ // CHECK: HLSLBufferDecl {{.*}} line:140 :9 cbuffer CB
120
138
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
121
139
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
122
140
cbuffer CB {
@@ -130,25 +148,27 @@ cbuffer CB {
130
148
RWBuffer <float > Buf;
131
149
// CHECK: VarDecl {{.*}} ea 'EmptyArrayTypedef':'float[10][0]'
132
150
EmptyArrayTypedef ea;
133
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.CB.5 definition
151
+ // CHECK: CXXRecordDecl {{.*}} implicit class __layout_CB_5 definition
134
152
// CHECK-NOT: FieldDecl
135
153
}
136
154
137
155
// check host layout struct with compatible base struct
138
- // CHECK: HLSLBufferDecl {{.*}} line:141 :9 cbuffer CB
156
+ // CHECK: HLSLBufferDecl {{.*}} line:159 :9 cbuffer CB
139
157
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
140
158
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
141
159
cbuffer CB {
142
160
// CHECK: VarDecl {{.*}} s8 'F'
143
161
F s8;
144
- // CHECK: CXXRecordDecl {{.*}} implicit class __layout.F definition
162
+ // CHECK: CXXRecordDecl {{.*}} implicit referenced class __layout_F definition
145
163
// 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 '
148
166
}
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), "" );
149
169
150
170
// anonymous structs
151
- // CHECK: HLSLBufferDecl {{.*}} line:154 :9 cbuffer CB
171
+ // CHECK: HLSLBufferDecl {{.*}} line:174 :9 cbuffer CB
152
172
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
153
173
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
154
174
cbuffer CB {
@@ -161,23 +181,26 @@ cbuffer CB {
161
181
// CHECK: FieldDecl {{.*}} f 'RWBuffer<float>':'hlsl::RWBuffer<float>'
162
182
RWBuffer <float > f;
163
183
} 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
165
185
// CHECK: CXXRecordDecl {{.*}} struct definition
166
186
struct {
167
- // CHECK: FieldDecl {{.*}} g 'int '
168
- int g;
187
+ // CHECK: FieldDecl {{.*}} g 'float '
188
+ float g;
169
189
// CHECK: FieldDecl {{.*}} f 'RWBuffer<float>':'hlsl::RWBuffer<float>'
170
190
RWBuffer <float > f;
171
191
} 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
174
194
// 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 '
180
200
}
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), "" );
181
204
182
205
// Add uses for the constant buffer declarations so they are not optimized away
183
206
export float foo () {
0 commit comments