From debca779719a72929932c589fe7ed3fea5341e53 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 21 Dec 2018 15:41:28 -0800 Subject: [PATCH] cmd/compile: fix line number for implicitly declared method expressions Method expressions where the method is implicitly declared have no line number. The Error method of the built-in error type is one such method. We leave the line number at the use of the method expression in this case. Fixes #29389 Change-Id: I29c64bb47b1a704576abf086599eb5af7b78df53 Reviewed-on: https://go-review.googlesource.com/c/155639 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/compile/internal/gc/closure.go | 7 ++++++- test/fixedbugs/issue29389.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue29389.go diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index f6b492a16f..284ecdf457 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -439,9 +439,14 @@ func makepartialcall(fn *Node, t0 *types.Type, meth *types.Sym) *Node { // Set line number equal to the line number where the method is declared. var m *types.Field - if lookdot0(meth, rcvrtype, &m, false) == 1 { + if lookdot0(meth, rcvrtype, &m, false) == 1 && m.Pos.IsKnown() { lineno = m.Pos } + // Note: !m.Pos.IsKnown() happens for method expressions where + // the method is implicitly declared. The Error method of the + // built-in error type is one such method. We leave the line + // number at the use of the method expression in this + // case. See issue 29389. tfn := nod(OTFUNC, nil, nil) tfn.List.Set(structargs(t0.Params(), true)) diff --git a/test/fixedbugs/issue29389.go b/test/fixedbugs/issue29389.go new file mode 100644 index 0000000000..43859fd38f --- /dev/null +++ b/test/fixedbugs/issue29389.go @@ -0,0 +1,17 @@ +// compile + +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Make sure we can correctly compile method expressions +// where the method is implicitly declared. + +package main + +import "io" + +func main() { + err := io.EOF + _ = err.Error +} -- 2.48.1