From 357a4a00bf6b7701f31b10be579a41ac3c4570f0 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+tobealive@users.noreply.github.com> Date: Thu, 29 Jun 2023 20:32:21 +0200 Subject: [PATCH] checker: fix generic infix expr type mismatch error (#18706) --- vlib/v/checker/infix.v | 8 +++++++ .../tests/generic_eq_wrong_type.err.out | 7 ++++++ .../tests/generic_eq_wrong_type.err.vv | 24 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 vlib/v/checker/tests/generic_eq_wrong_type.err.out create mode 100644 vlib/v/checker/tests/generic_eq_wrong_type.err.vv diff --git a/vlib/v/checker/infix.v b/vlib/v/checker/infix.v index 2446ba4ad..2b29c1533 100644 --- a/vlib/v/checker/infix.v +++ b/vlib/v/checker/infix.v @@ -743,6 +743,14 @@ fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { // Dual sides check (compatibility check) if node.left !is ast.ComptimeCall && node.right !is ast.ComptimeCall { + if left_type.has_flag(.generic) { + left_type = c.unwrap_generic(left_type) + left_sym = c.table.sym(left_type) + } + if right_type.has_flag(.generic) { + right_type = c.unwrap_generic(right_type) + right_sym = c.table.sym(right_type) + } if !(c.symmetric_check(left_type, right_type) && c.symmetric_check(right_type, left_type)) && !c.pref.translated && !c.file.is_translated && !node.left.is_auto_deref_var() && !node.right.is_auto_deref_var() { diff --git a/vlib/v/checker/tests/generic_eq_wrong_type.err.out b/vlib/v/checker/tests/generic_eq_wrong_type.err.out new file mode 100644 index 000000000..e572b6f32 --- /dev/null +++ b/vlib/v/checker/tests/generic_eq_wrong_type.err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/generic_eq_wrong_type.err.vv:9:13: error: infix expr: cannot use `string` (right expression) as `rune` + 7 | if ztest == `\n` { + 8 | println('${z}: \\n') + 9 | } else if ztest == '\r' { + | ~~~~~~~~~~~~~ + 10 | println('${z}: \\r') + 11 | } else { diff --git a/vlib/v/checker/tests/generic_eq_wrong_type.err.vv b/vlib/v/checker/tests/generic_eq_wrong_type.err.vv new file mode 100644 index 000000000..eec0b1ab5 --- /dev/null +++ b/vlib/v/checker/tests/generic_eq_wrong_type.err.vv @@ -0,0 +1,24 @@ +struct Scanner[T] { + contents []T +} + +pub fn (s Scanner[T]) tokenize() { + for z, ztest in s.contents { + if ztest == `\n` { + println('${z}: \\n') + } else if ztest == '\r' { + println('${z}: \\r') + } else { + println('${z}: ${ztest}') + } + } +} + +pub fn new_scanner[T](contents []T) Scanner[T] { + return Scanner[T]{contents} +} + +fn main() { + s := new_scanner([`\n`, `b`]) + s.tokenize() +} -- 2.39.5