writer/msl: Wrap each array type in a struct

This allows them to be used in various places that WGSL allows, such
as function return types and parameters, and as the type of the RHS of
an assignment.

Fixed: tint:814
Fixed: tint:820
Change-Id: Idb6a901b9a34e96bb9733cc158191e7b3bafaa0e
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/52844
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>
diff --git a/test/array/function_parameter.wgsl b/test/array/function_parameter.wgsl
new file mode 100644
index 0000000..0b301e7
--- /dev/null
+++ b/test/array/function_parameter.wgsl
@@ -0,0 +1,21 @@
+fn f1(a : array<f32, 4>) -> f32 {
+  return a[3];
+}
+
+fn f2(a : array<array<f32, 4>, 3>) -> f32 {
+  return a[2][3];
+}
+
+fn f3(a : array<array<array<f32, 4>, 3>, 2>) -> f32 {
+  return a[1][2][3];
+}
+
+[[stage(compute)]]
+fn main() {
+  let a1 : array<f32, 4> = array<f32, 4>();
+  let a2 : array<array<f32, 4>, 3> = array<array<f32, 4>, 3>();
+  let a3 : array<array<array<f32, 4>, 3>, 2> = array<array<array<f32, 4>, 3>, 2>();
+  let v1 : f32 = f1(a1);
+  let v2 : f32 = f2(a2);
+  let v3 : f32 = f3(a3);
+}