diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 370f21befbdb66..cc98c3ae69e6c2 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 00000000000000..46136dc68f5327 --- /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)