From 114c382c46362fb6e0912e57527d7f346fd138d4 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 6 Jun 2021 22:40:13 +0800 Subject: [PATCH] parser: fix generic fn typeof name (#10363) --- vlib/v/parser/fn.v | 9 +++++++ vlib/v/tests/generic_fn_typeof_name_test.v | 28 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 8416896469..749d304a67 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -578,6 +578,15 @@ fn (mut p Parser) parse_generic_names() []string { } p.check(.name) param_names << name + if p.table.find_type_idx(name) == 0 { + p.table.register_type_symbol(ast.TypeSymbol{ + name: name + cname: util.no_dots(name) + mod: p.mod + kind: .any + is_public: true + }) + } first_done = true count++ } diff --git a/vlib/v/tests/generic_fn_typeof_name_test.v b/vlib/v/tests/generic_fn_typeof_name_test.v index 413553bb25..75fa7e7bd3 100644 --- a/vlib/v/tests/generic_fn_typeof_name_test.v +++ b/vlib/v/tests/generic_fn_typeof_name_test.v @@ -13,3 +13,31 @@ fn test_generics_fn_typeof_name() { println(ret) assert ret == 'fn (mut Client, string)' } + +// test no paras generics fn typeof name +struct Test1 {} + +struct Test2 {} + +fn print_type() string { + name := T.name + println(name) + return name +} + +fn test_no_paras_generics_fn_typeof_name() { + mut ret := print_type() + assert ret == 'Test1' + + ret = print_type() + assert ret == 'Test2' + + ret = print_type() + assert ret == 'int' + + ret = print_type() + assert ret == 'f32' + + ret = print_type() + assert ret == 'bool' +}