n.Left = typecheck(n.Left, Erv|Easgn)
}
- n.Right = typecheck(n.Right, Erv)
+ // Use Efnstruct so we can emit an "N variables but M values" error
+ // to be consistent with typecheckas2 (#26616).
+ n.Right = typecheck(n.Right, Erv|Efnstruct)
checkassign(n, n.Left)
if n.Right != nil && n.Right.Type != nil {
- if n.Left.Type != nil {
+ if n.Right.Type.IsFuncArgStruct() {
+ yyerror("assignment mismatch: 1 variable but %d values", n.Right.Type.NumFields())
+ // Multi-value RHS isn't actually valid for OAS; nil out
+ // to indicate failed typechecking.
+ n.Right.Type = nil
+ } else if n.Left.Type != nil {
n.Right = assignconv(n.Right, n.Left.Type, "assignment")
}
}
--- /dev/null
+// errorcheck
+
+// Copyright 2018 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.
+
+package p
+
+var x int = three() // ERROR "1 variable but 3 values"
+
+func f() {
+ var _ int = three() // ERROR "1 variable but 3 values"
+ var a int = three() // ERROR "1 variable but 3 values"
+ a = three() // ERROR "1 variable but 3 values"
+ b := three() // ERROR "1 variable but 3 values"
+
+ _, _ = a, b
+}
+
+func three() (int, int, int)