From f3d8bbdf3d964d975ed0b908152a7fcbb8f7a42c Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 11 Jan 2022 22:25:16 +0800 Subject: [PATCH] cgen: fix `$if T.typ is Type {` (#13135) --- vlib/v/gen/c/comptime.v | 6 +++++- ...comptime_if_expr_generic_typ_is_type_test.v | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/comptime_if_expr_generic_typ_is_type_test.v diff --git a/vlib/v/gen/c/comptime.v b/vlib/v/gen/c/comptime.v index ac4443e9c6..5ccad7f12a 100644 --- a/vlib/v/gen/c/comptime.v +++ b/vlib/v/gen/c/comptime.v @@ -375,7 +375,11 @@ fn (mut g Gen) comptime_if_cond(cond ast.Expr, pkg_exist bool) bool { } } else if left is ast.SelectorExpr { name = '${left.expr}.$left.field_name' - exp_type = g.comptime_var_type_map[name] + if left.gkind_field == .typ { + exp_type = g.unwrap_generic(left.name_type) + } else { + exp_type = g.comptime_var_type_map[name] + } } else if left is ast.TypeNode { // this is only allowed for generics currently, otherwise blocked by checker exp_type = g.unwrap_generic(left.typ) diff --git a/vlib/v/tests/comptime_if_expr_generic_typ_is_type_test.v b/vlib/v/tests/comptime_if_expr_generic_typ_is_type_test.v new file mode 100644 index 0000000000..63d61ff21a --- /dev/null +++ b/vlib/v/tests/comptime_if_expr_generic_typ_is_type_test.v @@ -0,0 +1,18 @@ +module main + +fn write(out T) string { + $if T.typ is bool { + println('FOO') + return 'FOO' + } $else $if T.typ !is bool { + println('BAR') + return 'BAR' + } + return 'EMPTY' +} + +fn test_comptime_if_expr_generic_typ_is_type() { + mut val := false + ret := write(val) + assert ret == 'FOO' +}