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();
+}