checker: fix method call errors for generic struct instances (#13261)
parent
7fd08eca96
commit
3bfad1b943
|
@ -1369,6 +1369,13 @@ pub fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type {
|
||||||
node.concrete_list_pos)
|
node.concrete_list_pos)
|
||||||
}
|
}
|
||||||
if method.generic_names.len > 0 {
|
if method.generic_names.len > 0 {
|
||||||
|
if !left_type.has_flag(.generic) {
|
||||||
|
if left_sym.info is ast.Struct {
|
||||||
|
if method.generic_names.len == left_sym.info.concrete_types.len {
|
||||||
|
node.concrete_types = left_sym.info.concrete_types
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return node.return_type
|
return node.return_type
|
||||||
}
|
}
|
||||||
return method.return_type
|
return method.return_type
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
fn test_generics_struct_inst_method_call() {
|
||||||
|
v1 := V2d<f32>{100}
|
||||||
|
r1 := v1.in_bounds(tp_lft, bt_rigt)
|
||||||
|
println(r1)
|
||||||
|
assert r1
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
tp_lft = V2d<f32>{20}
|
||||||
|
bt_rigt = V2d<f32>{650}
|
||||||
|
)
|
||||||
|
|
||||||
|
struct V2d<T> {
|
||||||
|
mut:
|
||||||
|
x T
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (v1 V2d<T>) unpack() T {
|
||||||
|
return v1.x
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (v1 V2d<T>) less_than(v2 V2d<T>) V2d<bool> {
|
||||||
|
return V2d<bool>{v1.x < v2.x}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (v1 V2d<T>) in_bounds(top_left V2d<T>, bottom_right V2d<T>) bool {
|
||||||
|
v1.less_than(bottom_right).unpack()
|
||||||
|
return true
|
||||||
|
}
|
Loading…
Reference in New Issue