From: Matthew Dempsky Date: Fri, 24 Aug 2018 19:37:25 +0000 (-0700) Subject: cmd/compile: use "N variables but M values" error for OAS X-Git-Tag: go1.12beta1~1171 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f7a633aa790c413fc460cdc0901c9ae429cf1175;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 370f21befb..cc98c3ae69 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -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") } } diff --git a/test/fixedbugs/issue26616.go b/test/fixedbugs/issue26616.go new file mode 100644 index 0000000000..46136dc68f --- /dev/null +++ b/test/fixedbugs/issue26616.go @@ -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)