[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()},