From 442544633d0f6a2ab3f6bafcec126fb09b683f51 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Mon, 29 Dec 2025 05:18:56 +0800 Subject: [PATCH] cgen: fix print interface when arg0 is function call (fix #26184) (#26188) --- vlib/v/gen/c/fn.v | 4 ++- .../interfaces/interface_err_msg_print_test.v | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/interfaces/interface_err_msg_print_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 4f9eb5cda..4f0de07e8 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2143,7 +2143,9 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { } } if !print_auto_str { - if is_print { + if is_print && node.args[0].expr !is ast.CallExpr { + // only need for `println(err)` + // not need for `println(err.msg())` g.inside_interface_deref = true defer(fn) { g.inside_interface_deref = false diff --git a/vlib/v/tests/interfaces/interface_err_msg_print_test.v b/vlib/v/tests/interfaces/interface_err_msg_print_test.v new file mode 100644 index 000000000..da43306f6 --- /dev/null +++ b/vlib/v/tests/interfaces/interface_err_msg_print_test.v @@ -0,0 +1,27 @@ +struct MyError { + code int + state string +} + +pub fn (e MyError) msg() string { + return 'something went wrong' +} + +pub fn (e MyError) code() int { + return e.code +} + +fn foo() ! { + return MyError{} +} + +fn test_interface_err_msg_print() { + foo() or { + if err is MyError { + eprintln(err.msg()) + exit(err.code()) + } else { + panic(err) + } + } +} -- 2.39.5