From 3f43389b57c5bce6b4ef32e4c848faf170dff51f Mon Sep 17 00:00:00 2001 From: visualfc Date: Thu, 13 Mar 2025 15:36:07 +0800 Subject: [PATCH] cl: compileErrWrapExpr check callExpr --- cl/compile_test.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++ cl/expr.go | 8 ++++-- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/cl/compile_test.go b/cl/compile_test.go index b72c4ad3d..88521d521 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -4251,3 +4251,69 @@ func main() { } `) } + +func TestErrWrapNoArgs(t *testing.T) { + gopClTest(t, ` +func foo(v ...int) (func(), error) { + return nil, nil +} +func Bar() (int, error) { + return 100, nil +} +foo!() +foo(1)!() +echo foo! +echo bar! +`, `package main + +import ( + "fmt" + "github.com/qiniu/x/errors" +) + +func foo(v ...int) (func(), error) { + return nil, nil +} +func Bar() (int, error) { + return 100, nil +} +func main() { + func() (_gop_ret func()) { + var _gop_err error + _gop_ret, _gop_err = foo() + if _gop_err != nil { + _gop_err = errors.NewFrame(_gop_err, "foo", "/foo/bar.gop", 8, "main.main") + panic(_gop_err) + } + return + }()() + func() (_gop_ret func()) { + var _gop_err error + _gop_ret, _gop_err = foo(1) + if _gop_err != nil { + _gop_err = errors.NewFrame(_gop_err, "foo(1)", "/foo/bar.gop", 9, "main.main") + panic(_gop_err) + } + return + }()() + fmt.Println(func() (_gop_ret func()) { + var _gop_err error + _gop_ret, _gop_err = foo() + if _gop_err != nil { + _gop_err = errors.NewFrame(_gop_err, "foo", "/foo/bar.gop", 10, "main.main") + panic(_gop_err) + } + return + }()) + fmt.Println(func() (_gop_ret int) { + var _gop_err error + _gop_ret, _gop_err = Bar() + if _gop_err != nil { + _gop_err = errors.NewFrame(_gop_err, "bar", "/foo/bar.gop", 11, "main.main") + panic(_gop_err) + } + return + }()) +} +`) +} diff --git a/cl/expr.go b/cl/expr.go index c79a67ce5..f82ac816b 100644 --- a/cl/expr.go +++ b/cl/expr.go @@ -1520,8 +1520,12 @@ func compileErrWrapExpr(ctx *blockCtx, v *ast.ErrWrapExpr, inFlags int) { if !useClosure && (cb.Scope().Parent() == types.Universe) { panic("TODO: can't use expr? in global") } - - compileExpr(ctx, v.X, inFlags) + expr := v.X + switch expr.(type) { + case *ast.Ident, *ast.SelectorExpr: + expr = &ast.CallExpr{Fun: expr} + } + compileExpr(ctx, expr, inFlags) x := cb.InternalStack().Pop() n := 0 results, ok := x.Type.(*types.Tuple)