cmd/compile: fix error message for &T{} literal mismatch

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>
diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go
index 69dced0..6b4673d 100644
--- a/src/cmd/compile/internal/gc/typecheck.go
+++ b/src/cmd/compile/internal/gc/typecheck.go
@@ -2923,6 +2923,14 @@
 
 	// 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
index 0000000..d5b95dd
--- /dev/null
+++ b/test/fixedbugs/issue26855.go
@@ -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"
+}