cmd/compile: use "N variables but M values" error for OAS

Makes the error message more consistent between OAS and OAS2.

Fixes #26616.

Change-Id: I07ab46c5ef8a37efb2cb557632697f5d1bf789f7
Reviewed-on: https://go-review.googlesource.com/131280
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Matthew Dempsky 2018-08-24 12:37:25 -07:00
parent 9c833831b2
commit f7a633aa79
2 changed files with 29 additions and 2 deletions

View file

@ -3333,10 +3333,17 @@ func typecheckas(n *Node) {
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")
}
}

View file

@ -0,0 +1,20 @@
// 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)