diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index a12a753bd..0d4445b3f 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -578,9 +578,13 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { return nil case *ast.SwitchStmt: - ast.Walk(c, n.Tag) - - eqOpcode, _ := convertToken(token.EQL, c.typeOf(n.Tag)) + eqOpcode := opcode.EQUAL + if n.Tag != nil { + ast.Walk(c, n.Tag) + eqOpcode, _ = convertToken(token.EQL, c.typeOf(n.Tag)) + } else { + emit.Bool(c.prog.BinWriter, true) + } switchEnd, label := c.generateLabel(labelEnd) lastSwitch := c.currentSwitch diff --git a/pkg/compiler/switch_test.go b/pkg/compiler/switch_test.go index 7a34e3174..ce90ee0c2 100644 --- a/pkg/compiler/switch_test.go +++ b/pkg/compiler/switch_test.go @@ -18,6 +18,21 @@ var switchTestCases = []testCase{ }`, big.NewInt(2), }, + { + "switch with no tag", + `package main + func f() bool { return false } + func Main() int { + switch { + case f(): + return 1 + case true: + return 2 + } + return 3 + }`, + big.NewInt(2), + }, { "simple switch fail", `package main