diff --git a/pkg/proc/breakpoints.go b/pkg/proc/breakpoints.go index 3eb09bbc..72b84680 100644 --- a/pkg/proc/breakpoints.go +++ b/pkg/proc/breakpoints.go @@ -425,12 +425,6 @@ func (rbpi *returnBreakpointInfo) Collect(thread Thread) []*Variable { return (v.Flags & VariableReturnArgument) != 0 }) - // Go saves the return variables in the opposite order that the user - // specifies them so here we reverse the slice to make it easier to - // understand. - for i := 0; i < len(vars)/2; i++ { - vars[i], vars[len(vars)-i-1] = vars[len(vars)-i-1], vars[i] - } return vars } diff --git a/pkg/proc/proc_test.go b/pkg/proc/proc_test.go index 4a5ce8d9..b8951c8a 100644 --- a/pkg/proc/proc_test.go +++ b/pkg/proc/proc_test.go @@ -3920,23 +3920,39 @@ func TestStepOutReturn(t *testing.T) { t.Fatalf("wrong number of return values %v", ret) } - if ret[0].Name != "str" { - t.Fatalf("(str) bad return value name %s", ret[0].Name) + stridx := 0 + numidx := 1 + + if !goversion.VersionAfterOrEqual(runtime.Version(), 1, 12) { + // in 1.11 and earlier the order of return values in DWARF is + // unspecified, in 1.11 and later it follows the order of definition + // specified by the user + for i := range ret { + if ret[i].Name == "str" { + stridx = i + numidx = 1 - i + break + } + } } - if ret[0].Kind != reflect.String { - t.Fatalf("(str) bad return value kind %v", ret[0].Kind) + + if ret[stridx].Name != "str" { + t.Fatalf("(str) bad return value name %s", ret[stridx].Name) } - if s := constant.StringVal(ret[0].Value); s != "return 47" { + if ret[stridx].Kind != reflect.String { + t.Fatalf("(str) bad return value kind %v", ret[stridx].Kind) + } + if s := constant.StringVal(ret[stridx].Value); s != "return 47" { t.Fatalf("(str) bad return value %q", s) } - if ret[1].Name != "num" { - t.Fatalf("(num) bad return value name %s", ret[1].Name) + if ret[numidx].Name != "num" { + t.Fatalf("(num) bad return value name %s", ret[numidx].Name) } - if ret[1].Kind != reflect.Int { - t.Fatalf("(num) bad return value kind %v", ret[1].Kind) + if ret[numidx].Kind != reflect.Int { + t.Fatalf("(num) bad return value kind %v", ret[numidx].Kind) } - if n, _ := constant.Int64Val(ret[1].Value); n != 48 { + if n, _ := constant.Int64Val(ret[numidx].Value); n != 48 { t.Fatalf("(num) bad return value %d", n) } }) diff --git a/service/test/integration2_test.go b/service/test/integration2_test.go index 50230ae7..6b2d2ff4 100644 --- a/service/test/integration2_test.go +++ b/service/test/integration2_test.go @@ -1450,24 +1450,40 @@ func TestClientServer_StepOutReturn(t *testing.T) { t.Fatalf("wrong number of return values %v", ret) } - if ret[0].Name != "str" { - t.Fatalf("(str) bad return value name %s", ret[0].Name) - } - if ret[0].Kind != reflect.String { - t.Fatalf("(str) bad return value kind %v", ret[0].Kind) - } - if ret[0].Value != "return 47" { - t.Fatalf("(str) bad return value %q", ret[0].Value) + stridx := 0 + numidx := 1 + + if !goversion.VersionAfterOrEqual(runtime.Version(), 1, 12) { + // in 1.11 and earlier the order of return values in DWARF is + // unspecified, in 1.11 and later it follows the order of definition + // specified by the user + for i := range ret { + if ret[i].Name == "str" { + stridx = i + numidx = 1 - i + break + } + } } - if ret[1].Name != "num" { - t.Fatalf("(num) bad return value name %s", ret[1].Name) + if ret[stridx].Name != "str" { + t.Fatalf("(str) bad return value name %s", ret[stridx].Name) } - if ret[1].Kind != reflect.Int { - t.Fatalf("(num) bad return value kind %v", ret[1].Kind) + if ret[stridx].Kind != reflect.String { + t.Fatalf("(str) bad return value kind %v", ret[stridx].Kind) } - if ret[1].Value != "48" { - t.Fatalf("(num) bad return value %s", ret[1].Value) + if ret[stridx].Value != "return 47" { + t.Fatalf("(str) bad return value %q", ret[stridx].Value) + } + + if ret[numidx].Name != "num" { + t.Fatalf("(num) bad return value name %s", ret[numidx].Name) + } + if ret[numidx].Kind != reflect.Int { + t.Fatalf("(num) bad return value kind %v", ret[numidx].Kind) + } + if ret[numidx].Value != "48" { + t.Fatalf("(num) bad return value %s", ret[numidx].Value) } }) }