[ir] Use inference for array of builtin structs

These structures are unnameable in WGSL, so we cannot use an explicit
element type when converting IR to AST.

Fixed: 353249345
Change-Id: I4cd2218a52839864ac9042f61df167dbdac2194d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/199777
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: David Neto <dneto@google.com>
diff --git a/src/tint/lang/wgsl/ir_roundtrip_test.cc b/src/tint/lang/wgsl/ir_roundtrip_test.cc
index 278e8a6..4d8d5cd 100644
--- a/src/tint/lang/wgsl/ir_roundtrip_test.cc
+++ b/src/tint/lang/wgsl/ir_roundtrip_test.cc
@@ -3391,5 +3391,15 @@
 )");
 }
 
+// Test that we do not try to name the unnameable builtin structure types in array declarations.
+// See crbug.com/353249345.
+TEST_F(IRToProgramRoundtripTest, BuiltinStructInInferredArrayType) {
+    RUN_TEST(R"(
+fn a(x : f32) {
+  let y = array(frexp(x));
+}
+)");
+}
+
 }  // namespace
 }  // namespace tint::wgsl
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index 265b787..f932f2e 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -953,6 +953,11 @@
             },
             [&](const core::type::Array* a) {
                 auto el = Type(a->ElemType());
+                if (!el) {
+                    // The element type is untypeable, so we need to infer it instead.
+                    return ast::Type{b.Expr(b.Ident("array"))};
+                }
+
                 Vector<const ast::Attribute*, 1> attrs;
                 if (!a->IsStrideImplicit()) {
                     attrs.Push(b.Stride(a->Stride()));