From 2e567ff9e59ee570571014e624e4d09b858eadf9 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 1 Jun 2024 20:10:48 -0300 Subject: [PATCH] checker: fix missing concrete type checking on a generic type specifier (#21614) --- vlib/v/checker/tests/missing_concrete_type_err.out | 7 +++++++ vlib/v/checker/tests/missing_concrete_type_err.vv | 9 +++++++++ vlib/v/parser/parse_type.v | 5 +++++ vlib/v/parser/parser.v | 5 +++++ 4 files changed, 26 insertions(+) create mode 100644 vlib/v/checker/tests/missing_concrete_type_err.out create mode 100644 vlib/v/checker/tests/missing_concrete_type_err.vv diff --git a/vlib/v/checker/tests/missing_concrete_type_err.out b/vlib/v/checker/tests/missing_concrete_type_err.out new file mode 100644 index 00000000000000..1991e744f7d6a6 --- /dev/null +++ b/vlib/v/checker/tests/missing_concrete_type_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/missing_concrete_type_err.vv:4:6: error: missing concrete type on generic type + 2 | + 3 | fn main() { + 4 | bar[Foo]() + | ~~~ + 5 | } + 6 | diff --git a/vlib/v/checker/tests/missing_concrete_type_err.vv b/vlib/v/checker/tests/missing_concrete_type_err.vv new file mode 100644 index 00000000000000..111e1656e577f3 --- /dev/null +++ b/vlib/v/checker/tests/missing_concrete_type_err.vv @@ -0,0 +1,9 @@ +struct Foo[T] {} + +fn main() { + bar[Foo]() +} + +fn bar[T]() { + +} \ No newline at end of file diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index 0855929f8716ef..900c003a8e9a09 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -542,6 +542,11 @@ fn (mut p Parser) parse_type() ast.Type { return 0 } sym := p.table.sym(typ) + if p.inside_fn_concrete_type && sym.info is ast.Struct { + if !typ.has_flag(.generic) && sym.info.generic_types.len > 0 { + p.error_with_pos('missing concrete type on generic type', option_pos.extend(p.prev_tok.pos())) + } + } if is_option && sym.info is ast.SumType && sym.info.is_anon { p.error_with_pos('an inline sum type cannot be an Option', option_pos.extend(p.prev_tok.pos())) } diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 23abfd95d8bf4d..55180f7eb85d20 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -47,6 +47,7 @@ mut: inside_for_expr bool inside_fn bool // true even with implicit main inside_fn_return bool + inside_fn_concrete_type bool // parsing fn_name[concrete_type]() call expr inside_call_args bool // true inside f( .... ) inside_unsafe_fn bool inside_str_interp bool @@ -3369,6 +3370,10 @@ fn (mut p Parser) parse_concrete_types() []ast.Type { if p.tok.kind !in [.lt, .lsbr] { return types } + p.inside_fn_concrete_type = true + defer { + p.inside_fn_concrete_type = false + } end_kind := if p.tok.kind == .lt { token.Kind.gt } else { token.Kind.rsbr } p.next() // `<` mut first_done := false