diff --git a/_test/assign19.go b/_test/assign19.go new file mode 100644 index 00000000..497ee505 --- /dev/null +++ b/_test/assign19.go @@ -0,0 +1,9 @@ +package main + +func main() { + a, b, c := 1, 2 + _, _, _ = a, b, c +} + +// Error: +// _test/assign19.go:4:2: cannot assign 2 values to 3 variables diff --git a/interp/cfg.go b/interp/cfg.go index 39133a4c..d0d19e9d 100644 --- a/interp/cfg.go +++ b/interp/cfg.go @@ -644,6 +644,14 @@ func (interp *Interpreter) cfg(root *node, sc *scope, importPath, pkgName string sbase = len(n.child) - n.nright } + // If len(RHS) > 1, each node must be single-valued, and the nth expression + // on the right is assigned to the nth operand on the left, so the number of + // nodes on the left and right sides must be equal + if n.nright > 1 && n.nright != n.nleft { + err = n.cfgErrorf("cannot assign %d values to %d variables", n.nright, n.nleft) + return + } + wireChild(n) for i := 0; i < n.nleft; i++ { dest, src := n.child[i], n.child[sbase+i] diff --git a/interp/interp_consistent_test.go b/interp/interp_consistent_test.go index 85a3b9ad..def0ee52 100644 --- a/interp/interp_consistent_test.go +++ b/interp/interp_consistent_test.go @@ -45,6 +45,7 @@ func TestInterpConsistencyBuild(t *testing.T) { file.Name() == "assign11.go" || // expect error file.Name() == "assign12.go" || // expect error file.Name() == "assign15.go" || // expect error + file.Name() == "assign19.go" || // expect error file.Name() == "bad0.go" || // expect error file.Name() == "break0.go" || // expect error file.Name() == "cont3.go" || // expect error