From b2f984280bf259c2a1471c6bd894a2c1bf2dd44f Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 14 Feb 2022 08:38:47 +0800 Subject: [PATCH] checker: strengthen the judgment of generic type parameters replacement, merge generic type init tests (#13460) --- vlib/v/checker/struct.v | 3 ++- ...cs_struct_init_type_parameter_count_err.out | 7 ------- ...ics_struct_init_type_parameter_count_err.vv | 16 ---------------- ...generics_struct_init_type_parameter_err.out | 18 ++++++++++++++++-- .../generics_struct_init_type_parameter_err.vv | 15 +++++++++++++-- 5 files changed, 31 insertions(+), 28 deletions(-) delete mode 100644 vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.out delete mode 100644 vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.vv diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index b530147212583e..d6adc3119b4a6b 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -154,7 +154,8 @@ pub fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { } } } - if node.generic_types.len > 0 && struct_sym.info.generic_types != node.generic_types { + if node.generic_types.len > 0 && struct_sym.info.generic_types.len == node.generic_types.len + && struct_sym.info.generic_types != node.generic_types { c.table.replace_generic_type(node.typ, node.generic_types) } } else if struct_sym.info is ast.Alias { diff --git a/vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.out b/vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.out deleted file mode 100644 index 8884a6c1e95708..00000000000000 --- a/vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.out +++ /dev/null @@ -1,7 +0,0 @@ -vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.vv:6:9: error: generic struct init expects 1 generic parameter, but got 2 - 4 | - 5 | pub fn send(res A, b B) string { - 6 | msg := Response{ - | ~~~~~~~~~~~~~~~ - 7 | result: res - 8 | } diff --git a/vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.vv b/vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.vv deleted file mode 100644 index 6d7e98c78dc9be..00000000000000 --- a/vlib/v/checker/tests/generics_struct_init_type_parameter_count_err.vv +++ /dev/null @@ -1,16 +0,0 @@ -struct Response { - result U -} - -pub fn send(res A, b B) string { - msg := Response{ - result: res - } - println(b) - return '$msg' -} - -fn main() { - mut ret := send(123, 22.2) - println(ret) -} diff --git a/vlib/v/checker/tests/generics_struct_init_type_parameter_err.out b/vlib/v/checker/tests/generics_struct_init_type_parameter_err.out index 40df99cfa9c169..d78f4f4eef5fd1 100644 --- a/vlib/v/checker/tests/generics_struct_init_type_parameter_err.out +++ b/vlib/v/checker/tests/generics_struct_init_type_parameter_err.out @@ -1,14 +1,28 @@ vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv:6:9: error: generic struct init type parameter `U` must be within the parameters `(A,B)` of the current generic function 4 | - 5 | pub fn send(res A, b B) string { + 5 | fn send_1(res A, b B) string { 6 | msg := Response{ | ~~~~~~~~~~~~ 7 | result: res 8 | } vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv:7:3: error: cannot assign to field `result`: expected `U`, not `int` - 5 | pub fn send(res A, b B) string { + 5 | fn send_1(res A, b B) string { 6 | msg := Response{ 7 | result: res | ~~~~~~~~~~~ 8 | } 9 | println(b) +vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv:14:9: error: generic struct init expects 1 generic parameter, but got 2 + 12 | + 13 | fn send_2(res A, b B) string { + 14 | msg := Response{ + | ~~~~~~~~~~~~~~~ + 15 | result: res + 16 | } +vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv:15:3: error: cannot assign to field `result`: expected `U`, not `int` + 13 | fn send_2(res A, b B) string { + 14 | msg := Response{ + 15 | result: res + | ~~~~~~~~~~~ + 16 | } + 17 | println(b) diff --git a/vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv b/vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv index 75b9429555b455..61a36c893587ec 100644 --- a/vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv +++ b/vlib/v/checker/tests/generics_struct_init_type_parameter_err.vv @@ -2,7 +2,7 @@ struct Response { result U } -pub fn send(res A, b B) string { +fn send_1(res A, b B) string { msg := Response{ result: res } @@ -10,7 +10,18 @@ pub fn send(res A, b B) string { return '$msg' } +fn send_2(res A, b B) string { + msg := Response{ + result: res + } + println(b) + return '$msg' +} + fn main() { - mut ret := send(123, 22.2) + mut ret := send_1(123, 22.2) + println(ret) + + ret = send_2(123, 22.2) println(ret) }