Skip to content

Commit

Permalink
interp: fix mismatch assign statement panic (#1606)
Browse files Browse the repository at this point in the history
  • Loading branch information
chikaku authored and ldez committed Apr 2, 2024
1 parent 2c92a7c commit d44bdad
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 0 deletions.
9 changes: 9 additions & 0 deletions _test/assign19.go
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions interp/cfg.go
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
1 change: 1 addition & 0 deletions interp/interp_consistent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d44bdad

Please sign in to comment.