mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-17 00:47:13 +00:00
Allow array size to be a module-scope constant
Change ast::Array to use an ast::Expression for its `size` field. The WGSL frontend now parses the array size as an `primary_expression`, and the Resolver is responsible for validating the expression is a signed or unsigned integer, and either a literal or a non-overridable module-scope constant. The Resolver evaluates the constant value of the size expression, and so the resolved sem::Array type still has a constant size as before. Fixed: tint:1068 Fixed: tint:1117 Change-Id: Icfa141482ea1e47ea8c21a25e9eb48221f176e9a Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/63061 Auto-Submit: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: James Price <jrprice@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Tint LUCI CQ
parent
69ce5f74ed
commit
4cc4315d6c
@@ -81,7 +81,7 @@ fn main() {
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
buffer_size : array<vec4<u32>, 1>;
|
||||
buffer_size : array<vec4<u32>, 1u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
@@ -134,7 +134,7 @@ fn main() {
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
buffer_size : array<vec4<u32>, 1>;
|
||||
buffer_size : array<vec4<u32>, 1u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
@@ -216,7 +216,7 @@ fn main() {
|
||||
auto* expect = R"(
|
||||
[[block]]
|
||||
struct tint_symbol {
|
||||
buffer_size : array<vec4<u32>, 2>;
|
||||
buffer_size : array<vec4<u32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(30)]] var<uniform> tint_symbol_1 : tint_symbol;
|
||||
|
||||
@@ -180,8 +180,8 @@ fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_p
|
||||
return mat4x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)), tint_symbol_11(buffer, (offset + 32u)), tint_symbol_11(buffer, (offset + 48u)));
|
||||
}
|
||||
|
||||
fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> array<vec3<f32>, 2> {
|
||||
var arr : array<vec3<f32>, 2>;
|
||||
fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> array<vec3<f32>, 2u> {
|
||||
var arr : array<vec3<f32>, 2u>;
|
||||
for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
|
||||
arr[i_1] = tint_symbol_8(buffer, (offset + (i_1 * 16u)));
|
||||
}
|
||||
@@ -378,8 +378,8 @@ fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_p
|
||||
return mat4x4<f32>(tint_symbol_11(buffer, (offset + 0u)), tint_symbol_11(buffer, (offset + 16u)), tint_symbol_11(buffer, (offset + 32u)), tint_symbol_11(buffer, (offset + 48u)));
|
||||
}
|
||||
|
||||
fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> array<vec3<f32>, 2> {
|
||||
var arr : array<vec3<f32>, 2>;
|
||||
fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : UB, offset : u32) -> array<vec3<f32>, 2u> {
|
||||
var arr : array<vec3<f32>, 2u>;
|
||||
for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
|
||||
arr[i_1] = tint_symbol_8(buffer, (offset + (i_1 * 16u)));
|
||||
}
|
||||
@@ -594,7 +594,7 @@ fn tint_symbol_20([[internal(disable_validation__ignore_constructible_function_p
|
||||
tint_symbol_11(buffer, (offset + 48u), value[3u]);
|
||||
}
|
||||
|
||||
fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : array<vec3<f32>, 2>) {
|
||||
fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : array<vec3<f32>, 2u>) {
|
||||
var array = value;
|
||||
for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
|
||||
tint_symbol_8(buffer, (offset + (i_1 * 16u)), array[i_1]);
|
||||
@@ -770,8 +770,8 @@ fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_p
|
||||
return mat4x4<f32>(tint_symbol_12(buffer, (offset + 0u)), tint_symbol_12(buffer, (offset + 16u)), tint_symbol_12(buffer, (offset + 32u)), tint_symbol_12(buffer, (offset + 48u)));
|
||||
}
|
||||
|
||||
fn tint_symbol_22([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> array<vec3<f32>, 2> {
|
||||
var arr : array<vec3<f32>, 2>;
|
||||
fn tint_symbol_22([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32) -> array<vec3<f32>, 2u> {
|
||||
var arr : array<vec3<f32>, 2u>;
|
||||
for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
|
||||
arr[i_1] = tint_symbol_9(buffer, (offset + (i_1 * 16u)));
|
||||
}
|
||||
@@ -948,7 +948,7 @@ fn tint_symbol_21([[internal(disable_validation__ignore_constructible_function_p
|
||||
tint_symbol_12(buffer, (offset + 48u), value[3u]);
|
||||
}
|
||||
|
||||
fn tint_symbol_22([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : array<vec3<f32>, 2>) {
|
||||
fn tint_symbol_22([[internal(disable_validation__ignore_constructible_function_parameter)]] buffer : SB, offset : u32, value : array<vec3<f32>, 2u>) {
|
||||
var array = value;
|
||||
for(var i_1 = 0u; (i_1 < 2u); i_1 = (i_1 + 1u)) {
|
||||
tint_symbol_9(buffer, (offset + (i_1 * 16u)), array[i_1]);
|
||||
|
||||
@@ -106,12 +106,12 @@ TEST_F(DecomposeStridedMatrixTest, ReadUniformMatrix) {
|
||||
struct S {
|
||||
[[size(16)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<uniform> s : S;
|
||||
|
||||
fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2>) -> mat2x2<f32> {
|
||||
fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
|
||||
return mat2x2<f32>(arr[0u], arr[1u]);
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ TEST_F(DecomposeStridedMatrixTest, ReadUniformColumn) {
|
||||
struct S {
|
||||
[[size(16)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<uniform> s : S;
|
||||
@@ -300,12 +300,12 @@ TEST_F(DecomposeStridedMatrixTest, ReadStorageMatrix) {
|
||||
struct S {
|
||||
[[size(8)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read_write> s : S;
|
||||
|
||||
fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2>) -> mat2x2<f32> {
|
||||
fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
|
||||
return mat2x2<f32>(arr[0u], arr[1u]);
|
||||
}
|
||||
|
||||
@@ -367,7 +367,7 @@ TEST_F(DecomposeStridedMatrixTest, ReadStorageColumn) {
|
||||
struct S {
|
||||
[[size(16)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read_write> s : S;
|
||||
@@ -431,13 +431,13 @@ TEST_F(DecomposeStridedMatrixTest, WriteStorageMatrix) {
|
||||
struct S {
|
||||
[[size(8)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read_write> s : S;
|
||||
|
||||
fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> [[stride(32)]] array<vec2<f32>, 2> {
|
||||
return [[stride(32)]] array<vec2<f32>, 2>(mat[0u], mat[1u]);
|
||||
fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> [[stride(32)]] array<vec2<f32>, 2u> {
|
||||
return [[stride(32)]] array<vec2<f32>, 2u>(mat[0u], mat[1u]);
|
||||
}
|
||||
|
||||
[[stage(compute), workgroup_size(1)]]
|
||||
@@ -498,7 +498,7 @@ TEST_F(DecomposeStridedMatrixTest, WriteStorageColumn) {
|
||||
struct S {
|
||||
[[size(8)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read_write> s : S;
|
||||
@@ -576,17 +576,17 @@ TEST_F(DecomposeStridedMatrixTest, ReadWriteViaPointerLets) {
|
||||
struct S {
|
||||
[[size(8)]]
|
||||
padding : u32;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2>;
|
||||
m : [[stride(32)]] array<vec2<f32>, 2u>;
|
||||
};
|
||||
|
||||
[[group(0), binding(0)]] var<storage, read_write> s : S;
|
||||
|
||||
fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2>) -> mat2x2<f32> {
|
||||
fn arr_to_mat2x2_stride_32(arr : [[stride(32)]] array<vec2<f32>, 2u>) -> mat2x2<f32> {
|
||||
return mat2x2<f32>(arr[0u], arr[1u]);
|
||||
}
|
||||
|
||||
fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> [[stride(32)]] array<vec2<f32>, 2> {
|
||||
return [[stride(32)]] array<vec2<f32>, 2>(mat[0u], mat[1u]);
|
||||
fn mat2x2_stride_32_to_arr(mat : mat2x2<f32>) -> [[stride(32)]] array<vec2<f32>, 2u> {
|
||||
return [[stride(32)]] array<vec2<f32>, 2u>(mat[0u], mat[1u]);
|
||||
}
|
||||
|
||||
[[stage(compute), workgroup_size(1)]]
|
||||
|
||||
@@ -80,7 +80,11 @@ ArrayBuilder PadArray(
|
||||
|
||||
auto* dst = ctx.dst;
|
||||
return [=] {
|
||||
return dst->ty.array(dst->create<ast::TypeName>(name), array->Count());
|
||||
if (array->IsRuntimeSized()) {
|
||||
return dst->ty.array(dst->create<ast::TypeName>(name));
|
||||
} else {
|
||||
return dst->ty.array(dst->create<ast::TypeName>(name), array->Count());
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -54,7 +54,31 @@ struct tint_padded_array_element {
|
||||
el : i32;
|
||||
};
|
||||
|
||||
var<private> arr : array<tint_padded_array_element, 4>;
|
||||
var<private> arr : array<tint_padded_array_element, 4u>;
|
||||
)";
|
||||
|
||||
auto got = Run<PadArrayElements>(src);
|
||||
|
||||
EXPECT_EQ(expect, str(got));
|
||||
}
|
||||
|
||||
TEST_F(PadArrayElementsTest, RuntimeArray) {
|
||||
auto* src = R"(
|
||||
[[block]]
|
||||
struct S {
|
||||
rta : [[stride(8)]] array<i32>;
|
||||
};
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_padded_array_element {
|
||||
[[size(8)]]
|
||||
el : i32;
|
||||
};
|
||||
|
||||
[[block]]
|
||||
struct S {
|
||||
rta : array<tint_padded_array_element>;
|
||||
};
|
||||
)";
|
||||
|
||||
auto got = Run<PadArrayElements>(src);
|
||||
@@ -78,9 +102,9 @@ struct tint_padded_array_element {
|
||||
};
|
||||
|
||||
fn f() {
|
||||
var arr : array<tint_padded_array_element, 4>;
|
||||
arr = array<tint_padded_array_element, 4>();
|
||||
arr = array<tint_padded_array_element, 4>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
|
||||
var arr : array<tint_padded_array_element, 4u>;
|
||||
arr = array<tint_padded_array_element, 4u>();
|
||||
arr = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
|
||||
let x = arr[3].el;
|
||||
}
|
||||
)";
|
||||
@@ -102,7 +126,7 @@ struct tint_padded_array_element {
|
||||
el : i32;
|
||||
};
|
||||
|
||||
fn f(a : array<tint_padded_array_element, 4>) -> i32 {
|
||||
fn f(a : array<tint_padded_array_element, 4u>) -> i32 {
|
||||
return a[2].el;
|
||||
}
|
||||
)";
|
||||
@@ -155,13 +179,13 @@ struct tint_padded_array_element {
|
||||
el : i32;
|
||||
};
|
||||
|
||||
type Array = array<tint_padded_array_element, 4>;
|
||||
type Array = array<tint_padded_array_element, 4u>;
|
||||
|
||||
fn f() {
|
||||
var arr : array<tint_padded_array_element, 4>;
|
||||
arr = array<tint_padded_array_element, 4>();
|
||||
arr = array<tint_padded_array_element, 4>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
|
||||
let vals : array<tint_padded_array_element, 4> = array<tint_padded_array_element, 4>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
|
||||
var arr : array<tint_padded_array_element, 4u>;
|
||||
arr = array<tint_padded_array_element, 4u>();
|
||||
arr = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
|
||||
let vals : array<tint_padded_array_element, 4u> = array<tint_padded_array_element, 4u>(tint_padded_array_element(1), tint_padded_array_element(2), tint_padded_array_element(3), tint_padded_array_element(4));
|
||||
arr = vals;
|
||||
let x = arr[3].el;
|
||||
}
|
||||
@@ -198,10 +222,10 @@ struct tint_padded_array_element_2 {
|
||||
};
|
||||
|
||||
struct S {
|
||||
a : array<tint_padded_array_element, 4>;
|
||||
b : array<tint_padded_array_element_1, 8>;
|
||||
c : array<tint_padded_array_element, 4>;
|
||||
d : array<tint_padded_array_element_2, 8>;
|
||||
a : array<tint_padded_array_element, 4u>;
|
||||
b : array<tint_padded_array_element_1, 8u>;
|
||||
c : array<tint_padded_array_element, 4u>;
|
||||
d : array<tint_padded_array_element_2, 8u>;
|
||||
};
|
||||
)";
|
||||
|
||||
@@ -231,7 +255,7 @@ struct tint_padded_array_element_2 {
|
||||
|
||||
struct tint_padded_array_element_1 {
|
||||
[[size(512)]]
|
||||
el : array<tint_padded_array_element_2, 4>;
|
||||
el : array<tint_padded_array_element_2, 4u>;
|
||||
};
|
||||
|
||||
struct tint_padded_array_element_5 {
|
||||
@@ -241,18 +265,18 @@ struct tint_padded_array_element_5 {
|
||||
|
||||
struct tint_padded_array_element_4 {
|
||||
[[size(64)]]
|
||||
el : array<tint_padded_array_element_5, 4>;
|
||||
el : array<tint_padded_array_element_5, 4u>;
|
||||
};
|
||||
|
||||
struct tint_padded_array_element_3 {
|
||||
[[size(512)]]
|
||||
el : array<tint_padded_array_element_4, 4>;
|
||||
el : array<tint_padded_array_element_4, 4u>;
|
||||
};
|
||||
|
||||
struct S {
|
||||
a : array<tint_padded_array_element, 4>;
|
||||
b : array<tint_padded_array_element_1, 4>;
|
||||
c : array<tint_padded_array_element_3, 4>;
|
||||
a : array<tint_padded_array_element, 4u>;
|
||||
b : array<tint_padded_array_element_1, 4u>;
|
||||
c : array<tint_padded_array_element_3, 4u>;
|
||||
};
|
||||
)";
|
||||
|
||||
@@ -286,7 +310,7 @@ struct tint_padded_array_element_2 {
|
||||
|
||||
struct tint_padded_array_element_1 {
|
||||
[[size(512)]]
|
||||
el : array<tint_padded_array_element_2, 4>;
|
||||
el : array<tint_padded_array_element_2, 4u>;
|
||||
};
|
||||
|
||||
struct tint_padded_array_element_5 {
|
||||
@@ -296,18 +320,18 @@ struct tint_padded_array_element_5 {
|
||||
|
||||
struct tint_padded_array_element_4 {
|
||||
[[size(64)]]
|
||||
el : array<tint_padded_array_element_5, 4>;
|
||||
el : array<tint_padded_array_element_5, 4u>;
|
||||
};
|
||||
|
||||
struct tint_padded_array_element_3 {
|
||||
[[size(512)]]
|
||||
el : array<tint_padded_array_element_4, 4>;
|
||||
el : array<tint_padded_array_element_4, 4u>;
|
||||
};
|
||||
|
||||
struct S {
|
||||
a : array<tint_padded_array_element, 4>;
|
||||
b : array<tint_padded_array_element_1, 4>;
|
||||
c : array<tint_padded_array_element_3, 4>;
|
||||
a : array<tint_padded_array_element, 4u>;
|
||||
b : array<tint_padded_array_element_1, 4u>;
|
||||
c : array<tint_padded_array_element_3, 4u>;
|
||||
};
|
||||
|
||||
fn f(s : S) -> i32 {
|
||||
@@ -345,7 +369,7 @@ struct tint_padded_array_element {
|
||||
el : i32;
|
||||
};
|
||||
|
||||
type T1 = array<tint_padded_array_element, 1>;
|
||||
type T1 = array<tint_padded_array_element, 1u>;
|
||||
|
||||
type T2 = i32;
|
||||
|
||||
@@ -354,7 +378,7 @@ struct tint_padded_array_element_1 {
|
||||
el : i32;
|
||||
};
|
||||
|
||||
fn f1(a : array<tint_padded_array_element_1, 2>) {
|
||||
fn f1(a : array<tint_padded_array_element_1, 2u>) {
|
||||
}
|
||||
|
||||
type T3 = i32;
|
||||
@@ -365,7 +389,7 @@ struct tint_padded_array_element_2 {
|
||||
};
|
||||
|
||||
fn f2() {
|
||||
var v : array<tint_padded_array_element_2, 3>;
|
||||
var v : array<tint_padded_array_element_2, 3u>;
|
||||
}
|
||||
)";
|
||||
|
||||
|
||||
@@ -35,9 +35,9 @@ fn main([[builtin(sample_index)]] sample_index : u32,
|
||||
auto* expect = R"(
|
||||
[[builtin(sample_index), internal(disable_validation__ignore_storage_class)]] var<in> sample_index_1 : u32;
|
||||
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1>;
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1u>;
|
||||
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value : array<u32, 1>;
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value : array<u32, 1u>;
|
||||
|
||||
fn main_inner(sample_index : u32, mask_in : u32) -> u32 {
|
||||
return mask_in;
|
||||
@@ -73,9 +73,9 @@ fn main([[builtin(sample_mask)]] mask_in : u32
|
||||
)";
|
||||
|
||||
auto* expect = R"(
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1>;
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1u>;
|
||||
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value : array<u32, 1>;
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value : array<u32, 1u>;
|
||||
|
||||
fn filter(mask : u32) -> u32 {
|
||||
return (mask & 3u);
|
||||
@@ -138,9 +138,9 @@ fn frag_main([[builtin(sample_index)]] sample_index : u32,
|
||||
|
||||
[[builtin(sample_index), internal(disable_validation__ignore_storage_class)]] var<in> sample_index_1 : u32;
|
||||
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1>;
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<in> mask_in_1 : array<u32, 1u>;
|
||||
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value_1 : array<u32, 1>;
|
||||
[[builtin(sample_mask), internal(disable_validation__ignore_storage_class)]] var<out> value_1 : array<u32, 1u>;
|
||||
|
||||
fn vert_main_inner() -> vec4<f32> {
|
||||
return vec4<f32>();
|
||||
|
||||
@@ -120,7 +120,11 @@ ast::Type* Transform::CreateASTTypeFor(CloneContext& ctx, const sem::Type* ty) {
|
||||
if (!a->IsStrideImplicit()) {
|
||||
decos.emplace_back(ctx.dst->create<ast::StrideDecoration>(a->Stride()));
|
||||
}
|
||||
return ctx.dst->create<ast::Array>(el, a->Count(), std::move(decos));
|
||||
if (a->IsRuntimeSized()) {
|
||||
return ctx.dst->ty.array(el, nullptr, std::move(decos));
|
||||
} else {
|
||||
return ctx.dst->ty.array(el, a->Count(), std::move(decos));
|
||||
}
|
||||
}
|
||||
if (auto* s = ty->As<sem::Struct>()) {
|
||||
return ctx.dst->create<ast::TypeName>(ctx.Clone(s->Declaration()->name()));
|
||||
|
||||
@@ -82,8 +82,14 @@ TEST_F(CreateASTTypeForTest, ArrayImplicitStride) {
|
||||
});
|
||||
ASSERT_TRUE(arr->Is<ast::Array>());
|
||||
ASSERT_TRUE(arr->As<ast::Array>()->type()->Is<ast::F32>());
|
||||
ASSERT_EQ(arr->As<ast::Array>()->size(), 2u);
|
||||
ASSERT_EQ(arr->As<ast::Array>()->decorations().size(), 0u);
|
||||
|
||||
auto* size_expr =
|
||||
arr->As<ast::Array>()->Size()->As<ast::ScalarConstructorExpression>();
|
||||
ASSERT_NE(size_expr, nullptr);
|
||||
auto* size = size_expr->literal()->As<ast::IntLiteral>();
|
||||
ASSERT_NE(size, nullptr);
|
||||
EXPECT_EQ(size->value_as_i32(), 2);
|
||||
}
|
||||
|
||||
TEST_F(CreateASTTypeForTest, ArrayNonImplicitStride) {
|
||||
@@ -92,7 +98,6 @@ TEST_F(CreateASTTypeForTest, ArrayNonImplicitStride) {
|
||||
});
|
||||
ASSERT_TRUE(arr->Is<ast::Array>());
|
||||
ASSERT_TRUE(arr->As<ast::Array>()->type()->Is<ast::F32>());
|
||||
ASSERT_EQ(arr->As<ast::Array>()->size(), 2u);
|
||||
ASSERT_EQ(arr->As<ast::Array>()->decorations().size(), 1u);
|
||||
ASSERT_TRUE(
|
||||
arr->As<ast::Array>()->decorations()[0]->Is<ast::StrideDecoration>());
|
||||
@@ -101,6 +106,13 @@ TEST_F(CreateASTTypeForTest, ArrayNonImplicitStride) {
|
||||
->As<ast::StrideDecoration>()
|
||||
->stride(),
|
||||
64u);
|
||||
|
||||
auto* size_expr =
|
||||
arr->As<ast::Array>()->Size()->As<ast::ScalarConstructorExpression>();
|
||||
ASSERT_NE(size_expr, nullptr);
|
||||
auto* size = size_expr->literal()->As<ast::IntLiteral>();
|
||||
ASSERT_NE(size, nullptr);
|
||||
EXPECT_EQ(size->value_as_i32(), 2);
|
||||
}
|
||||
|
||||
TEST_F(CreateASTTypeForTest, Struct) {
|
||||
|
||||
@@ -259,7 +259,7 @@ struct State {
|
||||
ctx.dst->Symbols().New(kStructName),
|
||||
{
|
||||
ctx.dst->Member(GetStructBufferName(),
|
||||
ctx.dst->ty.array<ProgramBuilder::u32, 0>(4)),
|
||||
ctx.dst->ty.array<ProgramBuilder::u32>(4)),
|
||||
},
|
||||
{
|
||||
ctx.dst->create<ast::StructBlockDecoration>(),
|
||||
|
||||
@@ -132,8 +132,7 @@ WrapArraysInStructs::WrappedArrayInfo WrapArraysInStructs::WrapArray(
|
||||
decos.emplace_back(
|
||||
c.dst->create<ast::StrideDecoration>(array->Stride()));
|
||||
}
|
||||
return c.dst->create<ast::Array>(el_type(c), array->Count(),
|
||||
std::move(decos));
|
||||
return c.dst->ty.array(el_type(c), array->Count(), std::move(decos));
|
||||
};
|
||||
|
||||
// Structure() will create and append the ast::Struct to the
|
||||
|
||||
@@ -40,7 +40,7 @@ var<private> arr : array<i32, 4>;
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
var<private> arr : tint_array_wrapper;
|
||||
@@ -60,7 +60,7 @@ fn f() {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
fn f() {
|
||||
@@ -82,7 +82,7 @@ fn f(a : array<i32, 4>) -> i32 {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
fn f(a : tint_array_wrapper) -> i32 {
|
||||
@@ -103,11 +103,11 @@ fn f() -> array<i32, 4> {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
fn f() -> tint_array_wrapper {
|
||||
return tint_array_wrapper(array<i32, 4>(1, 2, 3, 4));
|
||||
return tint_array_wrapper(array<i32, 4u>(1, 2, 3, 4));
|
||||
}
|
||||
)";
|
||||
|
||||
@@ -132,22 +132,22 @@ fn f() {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 2>;
|
||||
arr : array<i32, 2u>;
|
||||
};
|
||||
|
||||
type Inner = tint_array_wrapper;
|
||||
|
||||
struct tint_array_wrapper_1 {
|
||||
arr : array<tint_array_wrapper, 2>;
|
||||
arr : array<tint_array_wrapper, 2u>;
|
||||
};
|
||||
|
||||
type Array = tint_array_wrapper_1;
|
||||
|
||||
fn f() {
|
||||
var arr : tint_array_wrapper_1;
|
||||
arr = tint_array_wrapper_1(array<tint_array_wrapper, 2>());
|
||||
arr = tint_array_wrapper_1(array<tint_array_wrapper, 2>(tint_array_wrapper(array<i32, 2>(1, 2)), tint_array_wrapper(array<i32, 2>(3, 4))));
|
||||
let vals : tint_array_wrapper_1 = tint_array_wrapper_1(array<tint_array_wrapper, 2>(tint_array_wrapper(array<i32, 2>(1, 2)), tint_array_wrapper(array<i32, 2>(3, 4))));
|
||||
arr = tint_array_wrapper_1(array<tint_array_wrapper, 2u>());
|
||||
arr = tint_array_wrapper_1(array<tint_array_wrapper, 2u>(tint_array_wrapper(array<i32, 2u>(1, 2)), tint_array_wrapper(array<i32, 2u>(3, 4))));
|
||||
let vals : tint_array_wrapper_1 = tint_array_wrapper_1(array<tint_array_wrapper, 2u>(tint_array_wrapper(array<i32, 2u>(1, 2)), tint_array_wrapper(array<i32, 2u>(3, 4))));
|
||||
arr = vals;
|
||||
let x = arr.arr[3];
|
||||
}
|
||||
@@ -168,11 +168,11 @@ struct S {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
struct tint_array_wrapper_1 {
|
||||
arr : array<i32, 8>;
|
||||
arr : array<i32, 8u>;
|
||||
};
|
||||
|
||||
struct S {
|
||||
@@ -197,15 +197,15 @@ struct S {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
struct tint_array_wrapper_1 {
|
||||
arr : array<tint_array_wrapper, 4>;
|
||||
arr : array<tint_array_wrapper, 4u>;
|
||||
};
|
||||
|
||||
struct tint_array_wrapper_2 {
|
||||
arr : array<tint_array_wrapper_1, 4>;
|
||||
arr : array<tint_array_wrapper_1, 4u>;
|
||||
};
|
||||
|
||||
struct S {
|
||||
@@ -234,15 +234,15 @@ fn f(s : S) -> i32 {
|
||||
)";
|
||||
auto* expect = R"(
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 4>;
|
||||
arr : array<i32, 4u>;
|
||||
};
|
||||
|
||||
struct tint_array_wrapper_1 {
|
||||
arr : array<tint_array_wrapper, 4>;
|
||||
arr : array<tint_array_wrapper, 4u>;
|
||||
};
|
||||
|
||||
struct tint_array_wrapper_2 {
|
||||
arr : array<tint_array_wrapper_1, 4>;
|
||||
arr : array<tint_array_wrapper_1, 4u>;
|
||||
};
|
||||
|
||||
struct S {
|
||||
@@ -282,7 +282,7 @@ fn f2() {
|
||||
type T0 = i32;
|
||||
|
||||
struct tint_array_wrapper {
|
||||
arr : array<i32, 1>;
|
||||
arr : array<i32, 1u>;
|
||||
};
|
||||
|
||||
type T1 = tint_array_wrapper;
|
||||
@@ -290,7 +290,7 @@ type T1 = tint_array_wrapper;
|
||||
type T2 = i32;
|
||||
|
||||
struct tint_array_wrapper_1 {
|
||||
arr : array<i32, 2>;
|
||||
arr : array<i32, 2u>;
|
||||
};
|
||||
|
||||
fn f1(a : tint_array_wrapper_1) {
|
||||
@@ -299,7 +299,7 @@ fn f1(a : tint_array_wrapper_1) {
|
||||
type T3 = i32;
|
||||
|
||||
struct tint_array_wrapper_2 {
|
||||
arr : array<i32, 3>;
|
||||
arr : array<i32, 3u>;
|
||||
};
|
||||
|
||||
fn f2() {
|
||||
|
||||
Reference in New Issue
Block a user