[ir][msl] Emit ir::Access

Add support for the ir access instruction in the MSL printer.

Bug: tint:1967
Change-Id: I3e51ba92eb9cb57ae13e325ea633d391dfa0b6a0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162240
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index ea4669c..f7c4c0c 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -34,6 +34,7 @@
 #include "src/tint/lang/core/constant/composite.h"
 #include "src/tint/lang/core/constant/splat.h"
 #include "src/tint/lang/core/fluent_types.h"
+#include "src/tint/lang/core/ir/access.h"
 #include "src/tint/lang/core/ir/binary.h"
 #include "src/tint/lang/core/ir/bitcast.h"
 #include "src/tint/lang/core/ir/constant.h"
@@ -259,6 +260,7 @@
                 [&](core::ir::Let* l) { EmitLet(l); },                      //
                 [&](core::ir::Load*) { MaybeEmitInstruction(inst); },       //
                 [&](core::ir::Construct*) { MaybeEmitInstruction(inst); },  //
+                [&](core::ir::Access*) { MaybeEmitInstruction(inst); },     //
                 TINT_ICE_ON_NO_MATCH);
         }
     }
@@ -296,6 +298,7 @@
                     [&](const core::ir::Construct* c) { EmitConstruct(out, c); },  //
                     [&](const core::ir::Var* var) { EmitVarName(out, var); },      //
                     [&](const core::ir::Bitcast* b) { EmitBitcast(out, b); },      //
+                    [&](const core::ir::Access* a) { EmitAccess(out, a); },        //
                     TINT_ICE_ON_NO_MATCH);
             },  //
             TINT_ICE_ON_NO_MATCH);
@@ -491,6 +494,28 @@
         out << ")";
     }
 
+    /// Emit an accessor
+    void EmitAccess(StringStream& out, const core::ir::Access* a) {
+        EmitValue(out, a->Object());
+
+        auto* current_type = a->Result()->Type();
+        for (auto* index : a->Indices()) {
+            Switch(
+                current_type,  //
+                [&](const core::type::Struct* s) {
+                    auto* c = index->As<core::ir::Constant>();
+                    auto* member = s->Members()[c->Value()->ValueAs<uint32_t>()];
+                    out << "." << member->Name().Name();
+                    current_type = member->Type();
+                },
+                [&](Default) {
+                    out << "[";
+                    EmitValue(out, index);
+                    out << "]";
+                });
+        }
+    }
+
     /// Emit a constructor
     void EmitConstruct(StringStream& out, const core::ir::Construct* c) {
         Switch(
diff --git a/test/tint/expressions/index/let/let/literal/array.wgsl.expected.ir.msl b/test/tint/expressions/index/let/let/literal/array.wgsl.expected.ir.msl
index 28251dc..73955d7 100644
--- a/test/tint/expressions/index/let/let/literal/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/let/literal/array.wgsl.expected.ir.msl
@@ -1,9 +1,20 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+
+int f() {
+  tint_array<int, 8> const a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+  int const i = 1;
+  return a[i];
+}
diff --git a/test/tint/expressions/index/let/let/literal/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/let/let/literal/matrix.wgsl.expected.ir.msl
index 28251dc..4c8cb95 100644
--- a/test/tint/expressions/index/let/let/literal/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/let/literal/matrix.wgsl.expected.ir.msl
@@ -1,9 +1,8 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float3 f() {
+  float3x3 const m = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+  int const i = 1;
+  return m[i];
+}
diff --git a/test/tint/expressions/index/let/let/literal/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/let/let/literal/vector.wgsl.expected.ir.msl
index 28251dc..faececb 100644
--- a/test/tint/expressions/index/let/let/literal/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/let/literal/vector.wgsl.expected.ir.msl
@@ -1,9 +1,8 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float f() {
+  float3 const v = float3(1.0f, 2.0f, 3.0f);
+  int const i = 1;
+  return v[i];
+}
diff --git a/test/tint/expressions/index/let/let/param/array.wgsl.expected.ir.msl b/test/tint/expressions/index/let/let/param/array.wgsl.expected.ir.msl
index 567c382..c72e77b 100644
--- a/test/tint/expressions/index/let/let/param/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/let/param/array.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/let/let/param/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/let/let/param/matrix.wgsl.expected.ir.msl
index 567c382..c72e77b 100644
--- a/test/tint/expressions/index/let/let/param/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/let/param/matrix.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/let/let/param/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/let/let/param/vector.wgsl.expected.ir.msl
index 567c382..c72e77b 100644
--- a/test/tint/expressions/index/let/let/param/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/let/param/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/let/literal/array.wgsl.expected.ir.msl b/test/tint/expressions/index/let/literal/array.wgsl.expected.ir.msl
index 28251dc..33dd8ee 100644
--- a/test/tint/expressions/index/let/literal/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/literal/array.wgsl.expected.ir.msl
@@ -1,9 +1,19 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+
+int f() {
+  tint_array<int, 8> const a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+  return a[1];
+}
diff --git a/test/tint/expressions/index/let/literal/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/let/literal/matrix.wgsl.expected.ir.msl
index 28251dc..5ebac5f 100644
--- a/test/tint/expressions/index/let/literal/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/literal/matrix.wgsl.expected.ir.msl
@@ -1,9 +1,7 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float3 f() {
+  float3x3 const m = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+  return m[1];
+}
diff --git a/test/tint/expressions/index/let/literal/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/let/literal/vector.wgsl.expected.ir.msl
index 28251dc..c1607bd 100644
--- a/test/tint/expressions/index/let/literal/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/literal/vector.wgsl.expected.ir.msl
@@ -1,9 +1,7 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float f() {
+  float3 const v = float3(1.0f, 2.0f, 3.0f);
+  return v[1];
+}
diff --git a/test/tint/expressions/index/let/param/array.wgsl.expected.ir.msl b/test/tint/expressions/index/let/param/array.wgsl.expected.ir.msl
index 28251dc..c72e77b 100644
--- a/test/tint/expressions/index/let/param/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/param/array.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/let/param/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/let/param/matrix.wgsl.expected.ir.msl
index 28251dc..c72e77b 100644
--- a/test/tint/expressions/index/let/param/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/param/matrix.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/let/param/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/let/param/vector.wgsl.expected.ir.msl
index 28251dc..c72e77b 100644
--- a/test/tint/expressions/index/let/param/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/param/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/let/var/literal/array.wgsl.expected.ir.msl b/test/tint/expressions/index/let/var/literal/array.wgsl.expected.ir.msl
index 28251dc..3942da9 100644
--- a/test/tint/expressions/index/let/var/literal/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/var/literal/array.wgsl.expected.ir.msl
@@ -1,9 +1,20 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+
+int f() {
+  tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+  int const i = 1;
+  return a[i];
+}
diff --git a/test/tint/expressions/index/let/var/literal/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/let/var/literal/matrix.wgsl.expected.ir.msl
index 28251dc..11f6252 100644
--- a/test/tint/expressions/index/let/var/literal/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/var/literal/matrix.wgsl.expected.ir.msl
@@ -1,9 +1,8 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float3 f() {
+  float3x3 m = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+  int const i = 1;
+  return m[i];
+}
diff --git a/test/tint/expressions/index/let/var/literal/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/let/var/literal/vector.wgsl.expected.ir.msl
index 2e88a5f..78e3fb3 100644
--- a/test/tint/expressions/index/let/var/literal/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/let/var/literal/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:265 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/let/literal/array.wgsl.expected.ir.msl b/test/tint/expressions/index/var/let/literal/array.wgsl.expected.ir.msl
index 28251dc..3942da9 100644
--- a/test/tint/expressions/index/var/let/literal/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/let/literal/array.wgsl.expected.ir.msl
@@ -1,9 +1,20 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+
+int f() {
+  tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+  int const i = 1;
+  return a[i];
+}
diff --git a/test/tint/expressions/index/var/let/literal/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/var/let/literal/matrix.wgsl.expected.ir.msl
index 28251dc..11f6252 100644
--- a/test/tint/expressions/index/var/let/literal/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/let/literal/matrix.wgsl.expected.ir.msl
@@ -1,9 +1,8 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float3 f() {
+  float3x3 m = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+  int const i = 1;
+  return m[i];
+}
diff --git a/test/tint/expressions/index/var/let/literal/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/var/let/literal/vector.wgsl.expected.ir.msl
index 2e88a5f..78e3fb3 100644
--- a/test/tint/expressions/index/var/let/literal/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/let/literal/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:265 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/let/param/array.wgsl.expected.ir.msl b/test/tint/expressions/index/var/let/param/array.wgsl.expected.ir.msl
index 567c382..c72e77b 100644
--- a/test/tint/expressions/index/var/let/param/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/let/param/array.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/let/param/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/var/let/param/matrix.wgsl.expected.ir.msl
index 567c382..c72e77b 100644
--- a/test/tint/expressions/index/var/let/param/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/let/param/matrix.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/let/param/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/var/let/param/vector.wgsl.expected.ir.msl
index 567c382..c72e77b 100644
--- a/test/tint/expressions/index/var/let/param/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/let/param/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/literal/array.wgsl.expected.ir.msl b/test/tint/expressions/index/var/literal/array.wgsl.expected.ir.msl
index 28251dc..4e160d55 100644
--- a/test/tint/expressions/index/var/literal/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/literal/array.wgsl.expected.ir.msl
@@ -1,9 +1,19 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
+template<typename T, size_t N>
+struct tint_array {
+  const constant T& operator[](size_t i) const constant { return elements[i]; }
+  device T& operator[](size_t i) device { return elements[i]; }
+  const device T& operator[](size_t i) const device { return elements[i]; }
+  thread T& operator[](size_t i) thread { return elements[i]; }
+  const thread T& operator[](size_t i) const thread { return elements[i]; }
+  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
+  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
+  T elements[N];
+};
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+
+int f() {
+  tint_array<int, 8> a = tint_array<int, 8>{1, 2, 3, 4, 5, 6, 7, 8};
+  return a[1];
+}
diff --git a/test/tint/expressions/index/var/literal/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/var/literal/matrix.wgsl.expected.ir.msl
index 28251dc..9983768 100644
--- a/test/tint/expressions/index/var/literal/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/literal/matrix.wgsl.expected.ir.msl
@@ -1,9 +1,7 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+float3 f() {
+  float3x3 m = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f));
+  return m[1];
+}
diff --git a/test/tint/expressions/index/var/literal/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/var/literal/vector.wgsl.expected.ir.msl
index 2e88a5f..78e3fb3 100644
--- a/test/tint/expressions/index/var/literal/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/literal/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:265 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/param/array.wgsl.expected.ir.msl b/test/tint/expressions/index/var/param/array.wgsl.expected.ir.msl
index 28251dc..c72e77b 100644
--- a/test/tint/expressions/index/var/param/array.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/param/array.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/param/matrix.wgsl.expected.ir.msl b/test/tint/expressions/index/var/param/matrix.wgsl.expected.ir.msl
index 28251dc..c72e77b 100644
--- a/test/tint/expressions/index/var/param/matrix.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/param/matrix.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::Access
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:305 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *
diff --git a/test/tint/expressions/index/var/param/vector.wgsl.expected.ir.msl b/test/tint/expressions/index/var/param/vector.wgsl.expected.ir.msl
index 2e88a5f..78e3fb3 100644
--- a/test/tint/expressions/index/var/param/vector.wgsl.expected.ir.msl
+++ b/test/tint/expressions/index/var/param/vector.wgsl.expected.ir.msl
@@ -1,6 +1,6 @@
 SKIP: FAILED
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:247 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
+<dawn>/src/tint/lang/msl/writer/printer/printer.cc:265 internal compiler error: Switch() matched no cases. Type: tint::core::ir::LoadVectorElement
 ********************************************************************
 *  The tint shader compiler has encountered an unexpected error.   *
 *                                                                  *