]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: adjust annotation of implicit operations.
authorDavid Chase <drchase@google.com>
Wed, 22 Jul 2015 19:03:02 +0000 (15:03 -0400)
committerDavid Chase <drchase@google.com>
Thu, 23 Jul 2015 14:19:07 +0000 (14:19 +0000)
Limit probe to ODOT/OIND/ODOTPTR for now; that works.

Fixes #11790

Change-Id: I411271e702c5fe6ceb880ca47c7dacc37ffcbb6a
Reviewed-on: https://go-review.googlesource.com/12532
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/compile/internal/gc/subr.go
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue11790.go [new file with mode: 0644]

index 7402e17e2a81aa10d04a687cf823ce7b78cf77f6..866d8e1bdee88e5cbd03bdb6840f8e64bd33439c 100644 (file)
@@ -2145,10 +2145,8 @@ func adddot(n *Node) *Node {
 
                        // rebuild elided dots
                        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.Implicit = true
                        }
 
                        return n
index 65fd29d2661071f403b18b488c0184d2044f51e2..dc2ba75e69b1a29673d15659811d0980f7c7cbfb 100644 (file)
@@ -2582,17 +2582,17 @@ func lookdot(n *Node, t *Type, dostrcmp int) *Type {
                        }
                }
 
+               pll := n
                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
                }
-               if ll.Implicit {
-                       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.
-                               // Make n->left == ll to clarify error message.
-                               n.Left = ll
-                               return nil
-                       }
+               if pll.Implicit && 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.
+                       // Make n->left == ll to clarify error message.
+                       n.Left = ll
+                       return nil
                }
 
                n.Right = methodname(n.Right, n.Left.Type)
diff --git a/test/fixedbugs/issue11790.go b/test/fixedbugs/issue11790.go
new file mode 100644 (file)
index 0000000..d7669f8
--- /dev/null
@@ -0,0 +1,36 @@
+// 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()
+}