From 93262353d675f7d99fb4355232bc39b3e7570b5e Mon Sep 17 00:00:00 2001 From: ka-weihe Date: Mon, 28 Dec 2020 18:32:51 +0100 Subject: [PATCH] cgen: fix map exists bug (#7647) (#7655) --- vlib/builtin/map_test.v | 11 +++++++++++ vlib/v/gen/cgen.v | 20 +++++++++++++++----- vlib/v/gen/cheaders.v | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/vlib/builtin/map_test.v b/vlib/builtin/map_test.v index f2219f226d..e951680a5d 100644 --- a/vlib/builtin/map_test.v +++ b/vlib/builtin/map_test.v @@ -367,6 +367,17 @@ fn test_map_in_mut() { assert m['one'] == 2 } +fn test_map_in() { + m := { + 'Foo': 'bar' + } + if 'foo'.capitalize() in m { + println('ok') + } else { + assert false + } +} + fn mut_map_with_relation_op_in_fn(mut m map[string]int) { if m['one'] == 1 { m['three'] = 3 diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index eb2b99cce6..8b95fba826 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -3081,12 +3081,22 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) { return } else if right_sym.kind == .map { g.write('_IN_MAP(') - g.expr(node.left) - g.write(', ') - if node.right_type.is_ptr() { - g.write('*') + if !node.left_type.is_ptr() { + left_type_str := g.table.type_to_str(node.left_type) + g.write('ADDR($left_type_str, ') + g.expr(node.left) + g.write(')') + } else { + g.expr(node.left) + } + g.write(', ') + if !node.right_type.is_ptr() { + g.write('ADDR(map, ') + g.expr(node.right) + g.write(')') + } else { + g.expr(node.right) } - g.expr(node.right) g.write(')') } else if right_sym.kind == .string { g.write('string_contains(') diff --git a/vlib/v/gen/cheaders.v b/vlib/v/gen/cheaders.v index 2430d08346..df64fa1771 100644 --- a/vlib/v/gen/cheaders.v +++ b/vlib/v/gen/cheaders.v @@ -272,7 +272,7 @@ static void* g_live_info = NULL; // take the address of an rvalue #define ADDR(type, expr) (&((type[]){expr}[0])) #define _PUSH_MANY(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push_many(arr, tmp.data, tmp.len);} -#define _IN_MAP(val, m) map_exists_1(&m, &val) +#define _IN_MAP(val, m) map_exists_1(m, val) // unsigned/signed comparisons static inline bool _us32_gt(uint32_t a, int32_t b) { return a > INT32_MAX || (int32_t)a > b; }