@@ -216,7 +216,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, UniformBuffer_UnalignedMember_A
216216// multiple of 16 bytes
217217TEST_F (ResolverAddressSpaceLayoutValidationTest, UniformBuffer_MembersOffsetNotMultipleOf16) {
218218 // struct Inner {
219- // @align(1 ) @size(5) scalar : i32;
219+ // @align(4 ) @size(5) scalar : i32;
220220 // };
221221 //
222222 // struct Outer {
@@ -229,7 +229,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, UniformBuffer_MembersOffsetNotM
229229
230230 Structure (Ident (Source{{12 , 34 }}, " Inner" ),
231231 Vector{
232- Member (" scalar" , ty.i32 (), Vector{MemberAlign (1_i ), MemberSize (5_a)}),
232+ Member (" scalar" , ty.i32 (), Vector{MemberAlign (4_i ), MemberSize (5_a)}),
233233 });
234234
235235 Structure (Source{{34 , 56 }}, " Outer" ,
@@ -247,13 +247,13 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, UniformBuffer_MembersOffsetNotM
247247 R"( 78:90 error: 'uniform' storage requires that the number of bytes between the start of the previous member of type struct and the current member be a multiple of 16 bytes, but there are currently 8 bytes between 'inner' and 'scalar'. Consider setting '@align(16)' on this member
248248note: see layout of struct:
249249/* align(4) size(12) */ struct Outer {
250- /* offset( 0) align(1) size( 5) */ inner : Inner,
251- /* offset( 5) align(1) size( 3) */ // -- implicit field alignment padding --
250+ /* offset( 0) align(4) size( 8) */ inner : Inner,
252251/* offset( 8) align(4) size( 4) */ scalar : i32,
253252/* */ };
25425312:34 note: and layout of previous member struct:
255- /* align(1) size(5) */ struct Inner {
256- /* offset(0) align(1) size(5) */ scalar : i32,
254+ /* align(4) size(8) */ struct Inner {
255+ /* offset(0) align(4) size(5) */ scalar : i32,
256+ /* offset(5) align(1) size(3) */ // -- implicit struct size padding --
257257/* */ };
25825822:24 note: 'Outer' used in address space 'uniform' here)" );
259259}
@@ -265,7 +265,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest,
265265 // a : i32;
266266 // b : i32;
267267 // c : i32;
268- // @align(1 ) @size(5) scalar : i32;
268+ // @align(4 ) @size(5) scalar : i32;
269269 // };
270270 //
271271 // struct Outer {
@@ -281,7 +281,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest,
281281 Member (" a" , ty.i32 ()),
282282 Member (" b" , ty.i32 ()),
283283 Member (" c" , ty.i32 ()),
284- Member (" scalar" , ty.i32 (), Vector{MemberAlign (1_i ), MemberSize (5_a)}),
284+ Member (" scalar" , ty.i32 (), Vector{MemberAlign (4_i ), MemberSize (5_a)}),
285285 });
286286
287287 Structure (Source{{34 , 56 }}, " Outer" ,
@@ -307,7 +307,7 @@ note: see layout of struct:
307307/* offset( 0) align(4) size( 4) */ a : i32,
308308/* offset( 4) align(4) size( 4) */ b : i32,
309309/* offset( 8) align(4) size( 4) */ c : i32,
310- /* offset(12) align(1 ) size( 5) */ scalar : i32,
310+ /* offset(12) align(4 ) size( 5) */ scalar : i32,
311311/* offset(17) align(1) size( 3) */ // -- implicit struct size padding --
312312/* */ };
31331322:24 note: 'Outer' used in address space 'uniform' here)" );
@@ -316,7 +316,7 @@ note: see layout of struct:
316316TEST_F (ResolverAddressSpaceLayoutValidationTest,
317317 UniformBuffer_MembersOffsetNotMultipleOf16_SuggestedFix) {
318318 // struct Inner {
319- // @align(1 ) @size(5) scalar : i32;
319+ // @align(4 ) @size(5) scalar : i32;
320320 // };
321321 //
322322 // struct Outer {
@@ -328,7 +328,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest,
328328 // var<uniform> a : Outer;
329329
330330 Structure (" Inner" , Vector{
331- Member (" scalar" , ty.i32 (), Vector{MemberAlign (1_i ), MemberSize (5_a)}),
331+ Member (" scalar" , ty.i32 (), Vector{MemberAlign (4_i ), MemberSize (5_a)}),
332332 });
333333
334334 Structure (" Outer" , Vector{
@@ -659,7 +659,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, RelaxedUniformLayout_MemberOffs
659659 // enable chromium_internal_relaxed_uniform_layout;
660660 //
661661 // struct Inner {
662- // @align(1 ) @size(5) scalar : i32;
662+ // @align(4 ) @size(5) scalar : i32;
663663 // };
664664 //
665665 // struct Outer {
@@ -673,7 +673,7 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, RelaxedUniformLayout_MemberOffs
673673 Enable (wgsl::Extension::kChromiumInternalRelaxedUniformLayout );
674674
675675 Structure (" Inner" , Vector{
676- Member (" scalar" , ty.i32 (), Vector{MemberAlign (1_i ), MemberSize (5_a)}),
676+ Member (" scalar" , ty.i32 (), Vector{MemberAlign (4_i ), MemberSize (5_a)}),
677677 });
678678
679679 Structure (" Outer" , Vector{
@@ -730,5 +730,29 @@ TEST_F(ResolverAddressSpaceLayoutValidationTest, RelaxedUniformLayout_ArrayStrid
730730 EXPECT_TRUE (r ()->Resolve ()) << r ()->error ();
731731}
732732
733+ TEST_F (ResolverAddressSpaceLayoutValidationTest, AlignAttributeTooSmall) {
734+ // struct S {
735+ // @align(4) vector : vec4u;
736+ // scalar : u32;
737+ // };
738+ //
739+ // @group(0) @binding(0)
740+ // var<storage, read_write> a : array<S>;
741+ Structure (
742+ " S" , Vector{
743+ Member (" vector" , ty.vec4 <u32 >(), Vector{MemberAlign (Expr (Source{{12 , 34 }}, 4_a))}),
744+ Member (" scalar" , ty.u32 ()),
745+ });
746+
747+ GlobalVar (Source{{56 , 78 }}, " a" , ty (" S" ), core::AddressSpace::kStorage ,
748+ core::Access::kReadWrite , Group (0_a), Binding (0_a));
749+
750+ ASSERT_FALSE (r ()->Resolve ());
751+ EXPECT_EQ (
752+ r ()->error (),
753+ R"( 12:34 error: alignment must be a multiple of '16' bytes for the 'storage' address space
754+ 56:78 note: 'S' used in address space 'storage' here)" );
755+ }
756+
733757} // namespace
734758} // namespace tint::resolver
0 commit comments