writer/msl: Fix zero-valued matrix constructors

Fixed: tint:813
Change-Id: Ia22f4264de89da76ab0a10cf52f267fcb1e2dbd4
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51440
Auto-Submit: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: Ben Clayton <bclayton@chromium.org>
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index ee976d0..f2928a9 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -935,7 +935,14 @@
   } else if (auto* vec = type->As<sem::Vector>()) {
     return EmitZeroValue(vec->type());
   } else if (auto* mat = type->As<sem::Matrix>()) {
-    return EmitZeroValue(mat->type());
+    if (!EmitType(mat, "")) {
+      return false;
+    }
+    out_ << "(";
+    if (!EmitZeroValue(mat->type())) {
+      return false;
+    }
+    out_ << ")";
   } else if (auto* arr = type->As<sem::Array>()) {
     out_ << "{";
     if (!EmitZeroValue(arr->ElemType())) {
diff --git a/src/writer/msl/generator_impl_constructor_test.cc b/src/writer/msl/generator_impl_constructor_test.cc
index 18a4988..aa76ded 100644
--- a/src/writer/msl/generator_impl_constructor_test.cc
+++ b/src/writer/msl/generator_impl_constructor_test.cc
@@ -131,6 +131,15 @@
           "float2x3(float3(1.0f, 2.0f, 3.0f), float3(3.0f, 4.0f, 5.0f))"));
 }
 
+TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Mat_Empty) {
+  WrapInFunction(mat4x4<f32>());
+
+  GeneratorImpl& gen = Build();
+
+  ASSERT_TRUE(gen.Generate()) << gen.error();
+  EXPECT_THAT(gen.result(), HasSubstr("float4x4(0.0f)"));
+}
+
 TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Array) {
   WrapInFunction(
       Construct(ty.array(ty.vec3<f32>(), 3), vec3<f32>(1.0f, 2.0f, 3.0f),
diff --git a/src/writer/msl/generator_impl_variable_decl_statement_test.cc b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
index 548a705..3ff3388 100644
--- a/src/writer/msl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/msl/generator_impl_variable_decl_statement_test.cc
@@ -107,7 +107,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
-  EXPECT_EQ(gen.result(), "  float3x2 a = 0.0f;\n");
+  EXPECT_EQ(gen.result(), "  float3x2 a = float3x2(0.0f);\n");
 }
 
 // TODO(crbug.com/tint/726): module-scope private and workgroup variables not
diff --git a/test/access/var/matrix.wgsl.expected.msl b/test/access/var/matrix.wgsl.expected.msl
index c577ac1..95fd2d6 100644
--- a/test/access/var/matrix.wgsl.expected.msl
+++ b/test/access/var/matrix.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 kernel void tint_symbol() {
-  float3x3 m = 0.0f;
+  float3x3 m = float3x3(0.0f);
   float3 const v = m[1];
   float const f = v[1];
   return;