diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index c7c40acae2..810b4bb4ad 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1658,6 +1658,12 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type { // builtin C.m*, C.s* only - temp c.warn('function `$f.name` must be called from an `unsafe` block', call_expr.pos) } + if f.is_generic { + sym := c.table.get_type_symbol(call_expr.generic_type) + if sym.kind == .placeholder { + c.error('unknown type `$sym.name`', call_expr.generic_list_pos) + } + } if f.is_generic && f.return_type.has_flag(.generic) { rts := c.table.get_type_symbol(f.return_type) if rts.kind == .struct_ { diff --git a/vlib/v/checker/tests/unknown_generic_type.out b/vlib/v/checker/tests/unknown_generic_type.out new file mode 100644 index 0000000000..545dd374f3 --- /dev/null +++ b/vlib/v/checker/tests/unknown_generic_type.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/unknown_generic_type.vv:5:13: error: unknown type `Foo` + 3 | + 4 | fn main() { + 5 | x := decode('{"name": "test"}')? + | ~~~~~ + 6 | println(x) + 7 | } diff --git a/vlib/v/checker/tests/unknown_generic_type.vv b/vlib/v/checker/tests/unknown_generic_type.vv new file mode 100644 index 0000000000..e9a52b569c --- /dev/null +++ b/vlib/v/checker/tests/unknown_generic_type.vv @@ -0,0 +1,7 @@ +fn decode(raw_data string) ?T { +} + +fn main() { + x := decode('{"name": "test"}')? + println(x) +}