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>
// 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)
--- /dev/null
+// 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"
+}