From 1ce93536d070a7faac9ca3e1c4313a907c0272ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=C3=A4schle?= Date: Fri, 8 Jan 2021 00:50:59 +0100 Subject: [PATCH] checker: fix panic in generic methods (#7944) --- vlib/v/checker/check_types.v | 3 +++ vlib/v/checker/tests/method_generic_infer_err.out | 6 ++++++ vlib/v/checker/tests/method_generic_infer_err.vv | 10 ++++++++++ 3 files changed, 19 insertions(+) create mode 100644 vlib/v/checker/tests/method_generic_infer_err.out create mode 100644 vlib/v/checker/tests/method_generic_infer_err.vv diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index 5bb2613026..d8438c8a40 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -426,6 +426,9 @@ pub fn (mut c Checker) infer_fn_types(f table.Fn, mut call_expr ast.CallExpr) { gt_name := 'T' mut typ := table.void_type for i, param in f.params { + if call_expr.args.len == 0 { + break + } arg := if i != 0 && call_expr.is_method { call_expr.args[i - 1] } else { call_expr.args[i] } if param.typ.has_flag(.generic) { typ = arg.typ diff --git a/vlib/v/checker/tests/method_generic_infer_err.out b/vlib/v/checker/tests/method_generic_infer_err.out new file mode 100644 index 0000000000..2017a6f7b5 --- /dev/null +++ b/vlib/v/checker/tests/method_generic_infer_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/method_generic_infer_err.vv:9:7: error: could not infer generic type `T` in call to `func` + 7 | fn main() { + 8 | data := Data{} + 9 | data.func() + | ~~~~~~ + 10 | } \ No newline at end of file diff --git a/vlib/v/checker/tests/method_generic_infer_err.vv b/vlib/v/checker/tests/method_generic_infer_err.vv new file mode 100644 index 0000000000..226c4c2eef --- /dev/null +++ b/vlib/v/checker/tests/method_generic_infer_err.vv @@ -0,0 +1,10 @@ +struct Data {} + +fn (_ Data) func() T { + return T{} +} + +fn main() { + data := Data{} + data.func() +}