diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index eb60cad43e..2cc04f5f64 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -63,8 +63,15 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { } } if need_generic_names { - c.error('generic function declaration must specify generic type names, e.g. foo', - node.pos) + if node.is_method { + c.add_error_detail('use `fn (r SomeType) foo() {`, not just `fn (r SomeType) foo() {`') + c.error('generic method declaration must specify generic type names', + node.pos) + } else { + c.add_error_detail('use `fn foo(x T) {`, not just `fn foo(x T) {`') + c.error('generic function declaration must specify generic type names', + node.pos) + } } } if node.language == .v && !c.is_builtin_mod && !node.is_anon { diff --git a/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out b/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out index f94fd49448..4e5d935b9e 100644 --- a/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out +++ b/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.out @@ -1,15 +1,24 @@ -vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:26:1: error: generic function declaration must specify generic type names, e.g. foo +vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:26:1: error: generic function declaration must specify generic type names 24 | } - 25 | + 25 | 26 | fn g_worker(g Generic) { | ~~~~~~~~~~~~~~~~~~~~~~~~~ 27 | t := <-g.ch 28 | handle(t) -vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:32:1: error: generic function declaration must specify generic type names, e.g. foo +Details: use `fn foo(x T) {`, not just `fn foo(x T) {` +vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:32:1: error: generic function declaration must specify generic type names 30 | } - 31 | + 31 | 32 | fn handle(t T) { | ~~~~~~~~~~~~~~ - 33 | println("hi") + 33 | println('hi') 34 | } - +Details: use `fn foo(x T) {`, not just `fn foo(x T) {` +vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv:40:1: error: generic method declaration must specify generic type names + 38 | type MayBe = None | T + 39 | + 40 | fn (m MayBe) is_some() bool { + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 41 | return m is T + 42 | } +Details: use `fn (r SomeType) foo() {`, not just `fn (r SomeType) foo() {` diff --git a/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv b/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv index f455a3da05..e56bf3d6c7 100644 --- a/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv +++ b/vlib/v/checker/tests/generic_fn_decl_without_generic_names_err.vv @@ -30,5 +30,13 @@ fn g_worker(g Generic) { } fn handle(t T) { - println("hi") + println('hi') +} + +struct None {} + +type MayBe = None | T + +fn (m MayBe) is_some() bool { + return m is T }