mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-02-12 19:22:52 +00:00
compiler: do not DROP return value with type assertion
The same problem as with IF. Example: ``` func foo() interface{} { ... } func Main() int{} { return foo().(int) <--- panic here } ```
This commit is contained in:
parent
dbce3c9a19
commit
f8d5c40928
2 changed files with 20 additions and 0 deletions
|
@ -105,6 +105,11 @@ func (c *funcScope) analyzeVoidCalls(node ast.Node) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case *ast.TypeAssertExpr:
|
||||||
|
ce, ok := n.X.(*ast.CallExpr)
|
||||||
|
if ok {
|
||||||
|
c.voidCalls[ce] = false
|
||||||
|
}
|
||||||
case *ast.BinaryExpr:
|
case *ast.BinaryExpr:
|
||||||
return false
|
return false
|
||||||
case *ast.RangeStmt:
|
case *ast.RangeStmt:
|
||||||
|
|
|
@ -123,3 +123,18 @@ func TestNamedReturn(t *testing.T) {
|
||||||
t.Run("EmptyReturn", runCase("", big.NewInt(1), big.NewInt(2)))
|
t.Run("EmptyReturn", runCase("", big.NewInt(1), big.NewInt(2)))
|
||||||
t.Run("AnotherVariable", runCase("b, c", big.NewInt(2), big.NewInt(3)))
|
t.Run("AnotherVariable", runCase("b, c", big.NewInt(2), big.NewInt(3)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTypeAssertReturn(t *testing.T) {
|
||||||
|
src := `
|
||||||
|
package main
|
||||||
|
|
||||||
|
func foo() interface{} {
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
func Main() int {
|
||||||
|
return foo().(int)
|
||||||
|
}
|
||||||
|
`
|
||||||
|
eval(t, src, big.NewInt(5))
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue