From bd16dd9fdf5b9953b39f3be18e626dea6a0c788d Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 8 Jul 2020 14:05:01 +0800 Subject: [PATCH] cgen: fix assert `sumtype is` (#5739) --- vlib/v/builder/msvc.v | 5 ++- vlib/v/gen/cgen.v | 52 ++++++++++++++++-------------- vlib/v/tests/assert_sumtype_test.v | 10 ++++++ 3 files changed, 40 insertions(+), 27 deletions(-) create mode 100644 vlib/v/tests/assert_sumtype_test.v diff --git a/vlib/v/builder/msvc.v b/vlib/v/builder/msvc.v index 4b0d38d65a..56bbd21ae2 100644 --- a/vlib/v/builder/msvc.v +++ b/vlib/v/builder/msvc.v @@ -142,7 +142,7 @@ fn find_vs(vswhere_dir, host_arch string) ?VsInstallation { res_output := res.output.trim_right('\r\n') // println('res: "$res"') version := os.read_file('$res_output\\VC\\Auxiliary\\Build\\Microsoft.VCToolsVersion.default.txt') or { - println('Unable to find msvc version') + //println('Unable to find msvc version') return error('Unable to find vs installation') } version2 := version // TODO remove. cgen option bug if expr @@ -313,7 +313,7 @@ pub fn (mut v Builder) cc_msvc() { fn (mut v Builder) build_thirdparty_obj_file_with_msvc(path string, moduleflags []cflag.CFlag) { msvc := v.cached_msvc - + if msvc.valid == false { verror('Cannot find MSVC on this OS') return @@ -408,4 +408,3 @@ pub fn msvc_string_flags(cflags []cflag.CFlag) MsvcStringFlags { other_flags: other_flags } } - diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 11da0fa69f..45340bef39 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -1005,24 +1005,24 @@ fn (mut g Gen) gen_assert_stmt(a ast.AssertStmt) { g.decrement_inside_ternary() if g.is_test { g.writeln('{') - g.writeln(' g_test_oks++;') + g.writeln('\tg_test_oks++;') metaname_ok := g.gen_assert_metainfo(a) - g.writeln(' main__cb_assertion_ok(&$metaname_ok);') + g.writeln('\tmain__cb_assertion_ok(&$metaname_ok);') g.writeln('} else {') - g.writeln(' g_test_fails++;') + g.writeln('\tg_test_fails++;') metaname_fail := g.gen_assert_metainfo(a) - g.writeln(' main__cb_assertion_failed(&$metaname_fail);') - g.writeln(' longjmp(g_jump_buffer, 1);') - g.writeln(' // TODO') - g.writeln(' // Maybe print all vars in a test function if it fails?') + g.writeln('\tmain__cb_assertion_failed(&$metaname_fail);') + g.writeln('\tlongjmp(g_jump_buffer, 1);') + g.writeln('\t// TODO') + g.writeln('\t// Maybe print all vars in a test function if it fails?') g.writeln('}') return } - g.writeln('{} else {') + g.writeln(' {} else {') metaname_panic := g.gen_assert_metainfo(a) - g.writeln(' __print_assert_failure(&$metaname_panic);') - g.writeln(' v_panic(tos_lit("Assertion failed..."));') - g.writeln(' exit(1);') + g.writeln('\t__print_assert_failure(&$metaname_panic);') + g.writeln('\tv_panic(tos_lit("Assertion failed..."));') + g.writeln('\texit(1);') g.writeln('}') } @@ -1032,27 +1032,27 @@ fn (mut g Gen) gen_assert_metainfo(a ast.AssertStmt) string { line_nr := a.pos.line_nr src := cestring(a.expr.str()) metaname := 'v_assert_meta_info_$g.new_tmp_var()' - g.writeln(' VAssertMetaInfo $metaname;') - g.writeln(' memset(&$metaname, 0, sizeof(VAssertMetaInfo));') - g.writeln(' ${metaname}.fpath = ${ctoslit(mod_path)};') - g.writeln(' ${metaname}.line_nr = $line_nr;') - g.writeln(' ${metaname}.fn_name = ${ctoslit(fn_name)};') - g.writeln(' ${metaname}.src = ${ctoslit(src)};') + g.writeln('\tVAssertMetaInfo $metaname;') + g.writeln('\tmemset(&$metaname, 0, sizeof(VAssertMetaInfo));') + g.writeln('\t${metaname}.fpath = ${ctoslit(mod_path)};') + g.writeln('\t${metaname}.line_nr = $line_nr;') + g.writeln('\t${metaname}.fn_name = ${ctoslit(fn_name)};') + g.writeln('\t${metaname}.src = ${ctoslit(src)};') match a.expr { ast.InfixExpr { - g.writeln(' ${metaname}.op = ${ctoslit(it.op.str())};') - g.writeln(' ${metaname}.llabel = ${ctoslit(it.left.str())};') - g.writeln(' ${metaname}.rlabel = ${ctoslit(it.right.str())};') - g.write(' ${metaname}.lvalue = ') + g.writeln('\t${metaname}.op = ${ctoslit(it.op.str())};') + g.writeln('\t${metaname}.llabel = ${ctoslit(it.left.str())};') + g.writeln('\t${metaname}.rlabel = ${ctoslit(it.right.str())};') + g.write('\t${metaname}.lvalue = ') g.gen_assert_single_expr(it.left, it.left_type) g.writeln(';') // - g.write(' ${metaname}.rvalue = ') + g.write('\t${metaname}.rvalue = ') g.gen_assert_single_expr(it.right, it.right_type) g.writeln(';') } ast.CallExpr { - g.writeln(' ${metaname}.op = tos_lit("call");') + g.writeln('\t${metaname}.op = tos_lit("call");') } else {} } @@ -1067,7 +1067,11 @@ fn (mut g Gen) gen_assert_single_expr(e ast.Expr, t table.Type) { ast.IndexExpr { g.write(ctoslit(unknown_value)) } ast.PrefixExpr { g.write(ctoslit(unknown_value)) } ast.MatchExpr { g.write(ctoslit(unknown_value)) } - else { g.gen_expr_to_string(e, t) } + ast.Type { + sym := g.table.get_type_symbol(t) + g.write(ctoslit('$sym.name')) + } + else { g.gen_expr_to_string(e, t) or { g.write(ctoslit('[$err]')) } } } g.write(' /* typeof: ' + typeof(e) + ' type: ' + t.str() + ' */ ') } diff --git a/vlib/v/tests/assert_sumtype_test.v b/vlib/v/tests/assert_sumtype_test.v new file mode 100644 index 0000000000..ec02a692d7 --- /dev/null +++ b/vlib/v/tests/assert_sumtype_test.v @@ -0,0 +1,10 @@ +struct Moon {} +struct Mars {} + +type World = Moon | Mars + +fn test_assert_sumtype() { + w := World(Moon{}) + assert w is Moon + assert w !is Mars +}