[tint][ir][val] Check that args to calls to builtins have types

Fixes: 356419162
Change-Id: I78a0ee03dc4162843a6c7b487ff812fa14ed197d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/200695
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: James Price <jrprice@google.com>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/tint/lang/core/ir/validator.cc b/src/tint/lang/core/ir/validator.cc
index c45c8ff..945ad35 100644
--- a/src/tint/lang/core/ir/validator.cc
+++ b/src/tint/lang/core/ir/validator.cc
@@ -1211,7 +1211,13 @@
 }
 
 void Validator::CheckBuiltinCall(const BuiltinCall* call) {
-    auto args = Transform<8>(call->Args(), [&](const ir::Value* v) { return v->Type(); });
+    auto args =
+        Transform<8>(call->Args(), [&](const ir::Value* v) { return v ? v->Type() : nullptr; });
+    if (args.Any([&](const type::Type* ty) { return ty == nullptr; })) {
+        AddError(call) << "argument to builtin has undefined type";
+        return;
+    }
+
     intrinsic::Context context{
         call->TableData(),
         type_mgr_,
diff --git a/src/tint/lang/core/ir/validator_test.cc b/src/tint/lang/core/ir/validator_test.cc
index 248cec3..c212405 100644
--- a/src/tint/lang/core/ir/validator_test.cc
+++ b/src/tint/lang/core/ir/validator_test.cc
@@ -791,6 +791,49 @@
 )");
 }
 
+TEST_F(IR_ValidatorTest, CallToBuiltinArgNullType) {
+    auto* f = b.Function("f", ty.void_());
+    b.Append(f->Block(), [&] {
+        auto* i = b.Var<function, f32>("i");
+        i->SetInitializer(b.Constant(0_f));
+        auto* load = b.Load(i);
+        auto* load_ret = load->Result(0);
+        b.Call(ty.f32(), BuiltinFn::kAbs, load_ret);
+        load_ret->SetType(nullptr);
+        b.Return(f);
+    });
+
+    auto res = ir::Validate(mod);
+    ASSERT_NE(res, Success);
+    EXPECT_EQ(res.Failure().reason.Str(),
+              R"(:4:5 error: load: result type is undefined
+    %3:undef = load %i
+    ^^^^^^^^
+
+:2:3 note: in block
+  $B1: {
+  ^^^
+
+:5:14 error: abs: argument to builtin has undefined type
+    %4:f32 = abs %3
+             ^^^
+
+:2:3 note: in block
+  $B1: {
+  ^^^
+
+note: # Disassembly
+%f = func():void {
+  $B1: {
+    %i:ptr<function, f32, read_write> = var, 0.0f
+    %3:undef = load %i
+    %4:f32 = abs %3
+    ret
+  }
+}
+)");
+}
+
 TEST_F(IR_ValidatorTest, Construct_Struct_ZeroValue) {
     auto* str_ty = ty.Struct(mod.symbols.New("MyStruct"), {
                                                               {mod.symbols.New("a"), ty.i32()},