]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix error message for &T{} literal mismatch
authorRobert Griesemer <gri@golang.org>
Wed, 19 Sep 2018 22:55:36 +0000 (15:55 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 20 Sep 2018 00:07:35 +0000 (00:07 +0000)
See the change and comment in typecheck.go for a detailed explanation.

Fixes #26855.

Change-Id: I7867f948490fc0873b1bd849048cda6acbc36e76
Reviewed-on: https://go-review.googlesource.com/136395
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue26855.go [new file with mode: 0644]

index 69dced00ac729fd461f72dca5e7e615c02b77602..6b4673dbdc65122837fbc37a39d0c6d73a871a3d 100644 (file)
@@ -2923,6 +2923,14 @@ func typecheckcomplit(n *Node) *Node {
 
        // Save original node (including n.Right)
        norig := n.copy()
+       // If n.Orig points to itself, norig.Orig must point to itself, too.
+       // Otherwise, because n.Op is changed below, n.Orig's Op is changed
+       // as well because it (and the copy norig) still point to the original
+       // node n. This caused the wrong complit Op to be used when printing
+       // error messages (issue #26855).
+       if n.Orig == n {
+               norig.Orig = norig
+       }
 
        setlineno(n.Right)
        n.Right = typecheck(n.Right, Etype|Ecomplit)
diff --git a/test/fixedbugs/issue26855.go b/test/fixedbugs/issue26855.go
new file mode 100644 (file)
index 0000000..d5b95dd
--- /dev/null
@@ -0,0 +1,28 @@
+// errorcheck
+
+// Copyright 2012 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.
+
+// Verify that we get the correct (T vs &T) literal specification
+// in the error message.
+
+package p
+
+type S struct {
+       f T
+}
+
+type P struct {
+       f *T
+}
+
+type T struct{}
+
+var _ = S{
+       f: &T{}, // ERROR "cannot use &T literal"
+}
+
+var _ = P{
+       f: T{}, // ERROR "cannot use T literal"
+}