Commit 2584974d authored by David Chase's avatar David Chase

cmd/compile: adjust annotation of implicit operations.

Limit probe to ODOT/OIND/ODOTPTR for now; that works.

Fixes #11790

Change-Id: I411271e702c5fe6ceb880ca47c7dacc37ffcbb6a
Reviewed-on: https://go-review.googlesource.com/12532Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
parent ca1d6c4b
...@@ -2145,10 +2145,8 @@ func adddot(n *Node) *Node { ...@@ -2145,10 +2145,8 @@ func adddot(n *Node) *Node {
// rebuild elided dots // rebuild elided dots
for c := d - 1; c >= 0; c-- { for c := d - 1; c >= 0; c-- {
if n.Left.Type != nil && Isptr[n.Left.Type.Etype] {
n.Left.Implicit = true
}
n.Left = Nod(ODOT, n.Left, newname(dotlist[c].field.Sym)) n.Left = Nod(ODOT, n.Left, newname(dotlist[c].field.Sym))
n.Left.Implicit = true
} }
return n return n
......
...@@ -2582,18 +2582,18 @@ func lookdot(n *Node, t *Type, dostrcmp int) *Type { ...@@ -2582,18 +2582,18 @@ func lookdot(n *Node, t *Type, dostrcmp int) *Type {
} }
} }
pll := n
ll := n.Left ll := n.Left
for ll.Left != nil { for ll.Left != nil && (ll.Op == ODOT || ll.Op == ODOTPTR || ll.Op == OIND) {
pll = ll
ll = ll.Left ll = ll.Left
} }
if ll.Implicit { if pll.Implicit && Isptr[ll.Type.Etype] && ll.Type.Sym != nil && ll.Type.Sym.Def != nil && ll.Type.Sym.Def.Op == OTYPE {
if Isptr[ll.Type.Etype] && ll.Type.Sym != nil && ll.Type.Sym.Def != nil && ll.Type.Sym.Def.Op == OTYPE {
// It is invalid to automatically dereference a named pointer type when selecting a method. // It is invalid to automatically dereference a named pointer type when selecting a method.
// Make n->left == ll to clarify error message. // Make n->left == ll to clarify error message.
n.Left = ll n.Left = ll
return nil return nil
} }
}
n.Right = methodname(n.Right, n.Left.Type) n.Right = methodname(n.Right, n.Left.Type)
n.Xoffset = f2.Width n.Xoffset = f2.Width
......
// compile
// Copyright 2015 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.
// Issue 11790: Incorrect error following named pointer dereference on field
package main
import "fmt"
type T0 struct {
x int
}
func (*T0) M0() {
fmt.Println("M0")
}
type T2 struct {
*T0
}
type Q *T2
func main() {
// If run, expected output is
// 42
// M0
t0 := T0{42}
t2 := T2{&t0}
var q Q = &t2
fmt.Println(q.x) // Comment out either this line or the next line and the program works
(*q).T0.M0()
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment