[msl-writer] Fix struct constructor emission

Zero value struct expressions may still be broken (tint:477).

Change-Id: I5cf2f13ed891a50e4b8f55ce4b80d2768aa358d9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/46101
Commit-Queue: Ben Clayton <bclayton@google.com>
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index e971d50..b3142a2 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -872,7 +872,7 @@
 }
 
 bool GeneratorImpl::EmitTypeConstructor(ast::TypeConstructorExpression* expr) {
-  if (expr->type()->Is<type::Array>()) {
+  if (expr->type()->IsAnyOf<type::Array, type::Struct>()) {
     out_ << "{";
   } else {
     if (!EmitType(expr->type(), "")) {
@@ -901,7 +901,7 @@
     }
   }
 
-  if (expr->type()->Is<type::Array>()) {
+  if (expr->type()->IsAnyOf<type::Array, type::Struct>()) {
     out_ << "}";
   } else {
     out_ << ")";
diff --git a/src/writer/msl/generator_impl_constructor_test.cc b/src/writer/msl/generator_impl_constructor_test.cc
index 04bb0ad..5d43ca8 100644
--- a/src/writer/msl/generator_impl_constructor_test.cc
+++ b/src/writer/msl/generator_impl_constructor_test.cc
@@ -154,8 +154,29 @@
             "float3(7.0f, 8.0f, 9.0f)}");
 }
 
-// TODO(dsinclair): Add struct constructor test.
-TEST_F(MslGeneratorImplTest, DISABLED_EmitConstructor_Type_Struct) {}
+TEST_F(MslGeneratorImplTest, EmitConstructor_Type_Struct) {
+  auto* struct_ty = Structure("S",
+                              ast::StructMemberList{
+                                  Member("a", ty.f32()),
+                                  Member("b", ty.u32()),
+                                  Member("c", ty.vec4<f32>()),
+                              },
+                              ast::DecorationList{});
+
+  ast::ExpressionList struct_values;
+  struct_values.push_back(Expr(0.f));
+  struct_values.push_back(Expr(42u));
+  struct_values.push_back(Construct(
+      ty.vec4<f32>(),
+      ast::ExpressionList{Expr(1.f), Expr(2.f), Expr(3.f), Expr(4.f)}));
+
+  auto* expr = Construct(struct_ty, struct_values);
+
+  GeneratorImpl& gen = Build();
+
+  ASSERT_TRUE(gen.EmitConstructor(expr)) << gen.error();
+  EXPECT_EQ(gen.result(), "{0.0f, 42u, float4(1.0f, 2.0f, 3.0f, 4.0f)}");
+}
 
 }  // namespace
 }  // namespace msl