From 550d7b90ba30c3f927fbe2b96b93105566457a76 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 6 Oct 2024 15:48:54 -0300 Subject: [PATCH] fix --- vlib/v/checker/checker.v | 2 +- .../tests/generics_field_struct_arr_err.out | 7 ++++++ .../tests/generics_field_struct_arr_err.vv | 24 +++++++++++++++++++ vlib/v/parser/parse_type.v | 13 ---------- 4 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 vlib/v/checker/tests/generics_field_struct_arr_err.out create mode 100644 vlib/v/checker/tests/generics_field_struct_arr_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 968842e650936a..945e2c8d759d16 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -5034,7 +5034,7 @@ fn (mut c Checker) ensure_generic_type_specify_type_names(typ ast.Type, pos toke } .sum_type { info := sym.info as ast.SumType - if info.generic_types.len > 0 && !typ.has_flag(.generic) && info.concrete_types.len == 0 { + if info.generic_types.len > 0 && info.concrete_types.len == 0 { c.error('`${sym.name}` type is generic sumtype, must specify the generic type names, e.g. ${sym.name}[T], ${sym.name}[int]', pos) return false diff --git a/vlib/v/checker/tests/generics_field_struct_arr_err.out b/vlib/v/checker/tests/generics_field_struct_arr_err.out new file mode 100644 index 00000000000000..9386113a5f9d1d --- /dev/null +++ b/vlib/v/checker/tests/generics_field_struct_arr_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/generics_field_struct_arr_err.vv:20:6: error: `Callback` type is generic sumtype, must specify the generic type names, e.g. Callback[T], Callback[int] + 18 | v T + 19 | prev T + 20 | cb2 []Callback + | ~~~~~~~~~~ + 21 | a int + 22 | } diff --git a/vlib/v/checker/tests/generics_field_struct_arr_err.vv b/vlib/v/checker/tests/generics_field_struct_arr_err.vv new file mode 100644 index 00000000000000..8e6c1f115f3e95 --- /dev/null +++ b/vlib/v/checker/tests/generics_field_struct_arr_err.vv @@ -0,0 +1,24 @@ +// callback types +type CBnoret[T] = fn (val T) + +type CBnoret2[T] = fn (val T, prev T) + +type CBvret[T] = fn (val T) T + +type CBvret2[T] = fn (val T, prev T) T + +type Callback[T] = CBnoret[T] | CBnoret2[T] | CBvret[T] | CBvret2[T] + +interface IObv[T] { + v T + prev T + cb []Callback[T] +} + +struct Obv[T] { +mut: + v T + prev T + cb2 []Callback + a int +} diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index 62a3b9efb64843..719bc4ae6a9b2c 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -123,19 +123,6 @@ fn (mut p Parser) parse_array_type(expecting token.Kind, is_option bool) ast.Typ idx := p.table.find_or_register_array_with_dims(elem_type, nr_dims) if elem_type.has_flag(.generic) { return ast.new_type(idx).set_flag(.generic) - } else { - sym := p.table.sym(elem_type) - match sym.info { - ast.Struct, ast.Interface, ast.SumType { - if sym.info.is_generic { - if p.tok.kind != .lsbr { - p.error_with_pos('`${sym.name}` type is generic type, must specify the generic type names, e.g. []${sym.name}[T]', - name_pos) - } - } - } - else {} - } } return ast.new_type(idx) }