mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: fix infinite recursion on generic interface cast
This commit is contained in:
parent
df8384b62e
commit
ae036b6146
@ -1613,6 +1613,9 @@ fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Position) {
|
||||
}
|
||||
|
||||
fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos token.Position) bool {
|
||||
if typ == interface_type {
|
||||
return true
|
||||
}
|
||||
$if debug_interface_type_implements ? {
|
||||
eprintln('> type_implements typ: $typ.debug() (`${c.table.type_to_str(typ)}`) | inter_typ: $interface_type.debug() (`${c.table.type_to_str(interface_type)}`)')
|
||||
}
|
||||
@ -1642,6 +1645,10 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to
|
||||
}
|
||||
}
|
||||
if inter_sym.info.is_generic {
|
||||
if inferred_type == interface_type {
|
||||
// terminate early, since otherwise we get an infinite recursion/segfault:
|
||||
return false
|
||||
}
|
||||
return c.type_implements(typ, inferred_type, pos)
|
||||
}
|
||||
}
|
||||
|
11
vlib/v/checker/tests/interface_generic_err.out
Normal file
11
vlib/v/checker/tests/interface_generic_err.out
Normal file
@ -0,0 +1,11 @@
|
||||
vlib/v/checker/tests/interface_generic_err.vv:7:9: error: generic struct init must specify type parameter, e.g. Foo<int>
|
||||
5 |
|
||||
6 | // no segfault without generic
|
||||
7 | what := What{}
|
||||
| ~~~~~~
|
||||
8 | why := Why(what)
|
||||
vlib/v/checker/tests/interface_generic_err.vv:8:8: error: could not infer generic type `T` in interface
|
||||
6 | // no segfault without generic
|
||||
7 | what := What{}
|
||||
8 | why := Why(what)
|
||||
| ~~~~~~~~~
|
8
vlib/v/checker/tests/interface_generic_err.vv
Normal file
8
vlib/v/checker/tests/interface_generic_err.vv
Normal file
@ -0,0 +1,8 @@
|
||||
struct What<T> {}
|
||||
|
||||
// with or without generic
|
||||
interface Why<T> {}
|
||||
|
||||
// no segfault without generic
|
||||
what := What{}
|
||||
why := Why(what)
|
Loading…
Reference in New Issue
Block a user