Skip to content

Commit

Permalink
cmd/compile: lookup methods of base type for named pointer type
Browse files Browse the repository at this point in the history
Passed toolstash-check.

Updates #21738
Fixes #21934

Change-Id: I59f0b2c9890146565ff913b04aeeeff7dc7a4499
Reviewed-on: https://go-review.googlesource.com/c/go/+/197561
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
  • Loading branch information
cuonglm authored and mdempsky committed Oct 4, 2019
1 parent 0fb95e7 commit 0471417
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/cmd/compile/internal/gc/subr.go
Original file line number Diff line number Diff line change
Expand Up @@ -1189,7 +1189,12 @@ func lookdot0(s *types.Sym, t *types.Type, save **types.Field, ignorecase bool)
}
}

u = methtype(t)
u = t
if t.Sym != nil && t.IsPtr() && !t.Elem().IsPtr() {
// If t is a defined pointer type, then x.m is shorthand for (*x).m.
u = t.Elem()
}
u = methtype(u)
if u != nil {
for _, f := range u.Methods().Slice() {
if f.Embedded == 0 && (f.Sym == s || (ignorecase && strings.EqualFold(f.Sym.Name, s.Name))) {
Expand Down
26 changes: 26 additions & 0 deletions test/fixedbugs/issue21934.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// errorcheck

// Copyright 2019 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.

// selector expression resolves incorrectly for defined
// pointer types.

package main

type E struct{ f int }
type T struct{ E }

func (*T) f() int { return 0 }

type P *T
type PP **T

func main() {
var x P
_ = x.f // ERROR "x\.f undefined \(type P has no field or method f\)"

var y PP
_ = y.f // ERROR "y\.f undefined \(type PP has no field or method f\)"
}

0 comments on commit 0471417

Please sign in to comment.