test: Add test cases for zero value constructors
Fixed: tint:477
Change-Id: I087c24904ab2f38524ab2c39092fbfb277fdba3b
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/55256
Auto-Submit: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/test/expressions/zero_init/struct/array.wgsl b/test/expressions/zero_init/struct/array.wgsl
new file mode 100644
index 0000000..148b457
--- /dev/null
+++ b/test/expressions/zero_init/struct/array.wgsl
@@ -0,0 +1,7 @@
+struct S {
+ a : array<f32, 4>;
+};
+
+fn f() {
+ var v = S();
+}
diff --git a/test/expressions/zero_init/struct/array.wgsl.expected.hlsl b/test/expressions/zero_init/struct/array.wgsl.expected.hlsl
new file mode 100644
index 0000000..6bb77c6
--- /dev/null
+++ b/test/expressions/zero_init/struct/array.wgsl.expected.hlsl
@@ -0,0 +1,15 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+ return;
+}
+
+struct tint_array_wrapper {
+ float arr[4];
+};
+struct S {
+ tint_array_wrapper a;
+};
+
+void f() {
+ S v = {{{0.0f, 0.0f, 0.0f, 0.0f}}};
+}
diff --git a/test/expressions/zero_init/struct/array.wgsl.expected.msl b/test/expressions/zero_init/struct/array.wgsl.expected.msl
new file mode 100644
index 0000000..61b9dc1
--- /dev/null
+++ b/test/expressions/zero_init/struct/array.wgsl.expected.msl
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct tint_array_wrapper {
+ float arr[4];
+};
+struct S {
+ tint_array_wrapper a;
+};
+
+void f() {
+ S v = {};
+}
+
diff --git a/test/expressions/zero_init/struct/array.wgsl.expected.spvasm b/test/expressions/zero_init/struct/array.wgsl.expected.spvasm
new file mode 100644
index 0000000..bb96631
--- /dev/null
+++ b/test/expressions/zero_init/struct/array.wgsl.expected.spvasm
@@ -0,0 +1,35 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+ OpExecutionMode %unused_entry_point LocalSize 1 1 1
+ OpName %unused_entry_point "unused_entry_point"
+ OpName %f "f"
+ OpName %S "S"
+ OpMemberName %S 0 "a"
+ OpName %v "v"
+ OpMemberDecorate %S 0 Offset 0
+ OpDecorate %_arr_float_uint_4 ArrayStride 4
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %float = OpTypeFloat 32
+ %uint = OpTypeInt 32 0
+ %uint_4 = OpConstant %uint 4
+%_arr_float_uint_4 = OpTypeArray %float %uint_4
+ %S = OpTypeStruct %_arr_float_uint_4
+ %12 = OpConstantNull %S
+%_ptr_Function_S = OpTypePointer Function %S
+%unused_entry_point = OpFunction %void None %1
+ %4 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %f = OpFunction %void None %1
+ %6 = OpLabel
+ %v = OpVariable %_ptr_Function_S Function %12
+ OpStore %v %12
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/zero_init/struct/array.wgsl.expected.wgsl b/test/expressions/zero_init/struct/array.wgsl.expected.wgsl
new file mode 100644
index 0000000..522939f
--- /dev/null
+++ b/test/expressions/zero_init/struct/array.wgsl.expected.wgsl
@@ -0,0 +1,7 @@
+struct S {
+ a : array<f32, 4>;
+};
+
+fn f() {
+ var v = S();
+}
diff --git a/test/expressions/zero_init/struct/scalar.wgsl b/test/expressions/zero_init/struct/scalar.wgsl
new file mode 100644
index 0000000..a1c58b3
--- /dev/null
+++ b/test/expressions/zero_init/struct/scalar.wgsl
@@ -0,0 +1,10 @@
+struct S {
+ i : i32;
+ u : u32;
+ f : f32;
+ b : bool;
+};
+
+fn f() {
+ var v = S();
+}
diff --git a/test/expressions/zero_init/struct/scalar.wgsl.expected.hlsl b/test/expressions/zero_init/struct/scalar.wgsl.expected.hlsl
new file mode 100644
index 0000000..29925ff
--- /dev/null
+++ b/test/expressions/zero_init/struct/scalar.wgsl.expected.hlsl
@@ -0,0 +1,15 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+ return;
+}
+
+struct S {
+ int i;
+ uint u;
+ float f;
+ bool b;
+};
+
+void f() {
+ S v = {0, 0u, 0.0f, false};
+}
diff --git a/test/expressions/zero_init/struct/scalar.wgsl.expected.msl b/test/expressions/zero_init/struct/scalar.wgsl.expected.msl
new file mode 100644
index 0000000..b72ea5e
--- /dev/null
+++ b/test/expressions/zero_init/struct/scalar.wgsl.expected.msl
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+ int i;
+ uint u;
+ float f;
+ bool b;
+};
+
+void f() {
+ S v = {};
+}
+
diff --git a/test/expressions/zero_init/struct/scalar.wgsl.expected.spvasm b/test/expressions/zero_init/struct/scalar.wgsl.expected.spvasm
new file mode 100644
index 0000000..1990f38
--- /dev/null
+++ b/test/expressions/zero_init/struct/scalar.wgsl.expected.spvasm
@@ -0,0 +1,40 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 15
+; Schema: 0
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+ OpExecutionMode %unused_entry_point LocalSize 1 1 1
+ OpName %unused_entry_point "unused_entry_point"
+ OpName %f "f"
+ OpName %S "S"
+ OpMemberName %S 0 "i"
+ OpMemberName %S 1 "u"
+ OpMemberName %S 2 "f"
+ OpMemberName %S 3 "b"
+ OpName %v "v"
+ OpMemberDecorate %S 0 Offset 0
+ OpMemberDecorate %S 1 Offset 4
+ OpMemberDecorate %S 2 Offset 8
+ OpMemberDecorate %S 3 Offset 12
+ %void = OpTypeVoid
+ %1 = OpTypeFunction %void
+ %int = OpTypeInt 32 1
+ %uint = OpTypeInt 32 0
+ %float = OpTypeFloat 32
+ %bool = OpTypeBool
+ %S = OpTypeStruct %int %uint %float %bool
+ %12 = OpConstantNull %S
+%_ptr_Function_S = OpTypePointer Function %S
+%unused_entry_point = OpFunction %void None %1
+ %4 = OpLabel
+ OpReturn
+ OpFunctionEnd
+ %f = OpFunction %void None %1
+ %6 = OpLabel
+ %v = OpVariable %_ptr_Function_S Function %12
+ OpStore %v %12
+ OpReturn
+ OpFunctionEnd
diff --git a/test/expressions/zero_init/struct/scalar.wgsl.expected.wgsl b/test/expressions/zero_init/struct/scalar.wgsl.expected.wgsl
new file mode 100644
index 0000000..0da534f
--- /dev/null
+++ b/test/expressions/zero_init/struct/scalar.wgsl.expected.wgsl
@@ -0,0 +1,10 @@
+struct S {
+ i : i32;
+ u : u32;
+ f : f32;
+ b : bool;
+};
+
+fn f() {
+ var v = S();
+}