checker: fix error for generic method on nested struct (#14322)
parent
2572c30d13
commit
e3ec27b73f
|
@ -1223,7 +1223,8 @@ pub fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
|
||||||
rec_sym := c.table.sym(node.left_type)
|
rec_sym := c.table.sym(node.left_type)
|
||||||
rec_is_generic := left_type.has_flag(.generic)
|
rec_is_generic := left_type.has_flag(.generic)
|
||||||
if rec_sym.info is ast.Struct {
|
if rec_sym.info is ast.Struct {
|
||||||
if rec_is_generic && node.concrete_types.len == 0 {
|
if rec_is_generic && node.concrete_types.len == 0
|
||||||
|
&& method.generic_names.len == rec_sym.info.generic_types.len {
|
||||||
node.concrete_types = rec_sym.info.generic_types
|
node.concrete_types = rec_sym.info.generic_types
|
||||||
} else if !rec_is_generic && rec_sym.info.concrete_types.len > 0
|
} else if !rec_is_generic && rec_sym.info.concrete_types.len > 0
|
||||||
&& node.concrete_types.len > 0
|
&& node.concrete_types.len > 0
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
struct Outer<T> {
|
||||||
|
mut:
|
||||||
|
inner Inner<T>
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Inner<T> {
|
||||||
|
val T
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut i Inner<T>) next<S>(input S) f64 {
|
||||||
|
$if S is f32 {
|
||||||
|
return 32
|
||||||
|
} $else {
|
||||||
|
panic('"$S.name" is not supported')
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut o Outer<T>) next<S>(input S) f64 {
|
||||||
|
$if S is f32 {
|
||||||
|
return o.inner.next(input)
|
||||||
|
} $else {
|
||||||
|
panic('"$S.name" is not supported')
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generics_method_on_nested_struct() {
|
||||||
|
mut outer := Outer<f64>{
|
||||||
|
inner: Inner<f64>{
|
||||||
|
val: 1.1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res := outer.next(f32(99.0))
|
||||||
|
println(res)
|
||||||
|
assert res == 32.0
|
||||||
|
}
|
Loading…
Reference in New Issue