ast: fix checking generic fn call with fntype arg mismatch (#12132)
parent
8d5931c96c
commit
83bc9b35b1
|
@ -1397,6 +1397,7 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func.name = ''
|
||||||
idx := t.find_or_register_fn_type('', func, true, false)
|
idx := t.find_or_register_fn_type('', func, true, false)
|
||||||
return new_type(idx).derive_add_muls(generic_type).clear_flag(.generic)
|
return new_type(idx).derive_add_muls(generic_type).clear_flag(.generic)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
vlib/v/checker/tests/generics_fn_called_fntype_arg_mismatch.vv:24:37: error: cannot use `fn (int) f64` as `fn (int) Point3D` in argument 2 to `new_array`
|
||||||
|
22 | println(good_cloud)
|
||||||
|
23 | // this should be a compilation error, because the function signature does not match:
|
||||||
|
24 | bad_cloud := new_array<Point3D>(3, fn (idx int) f64 {
|
||||||
|
| ~~~~~~~~~~~~~~~~~~
|
||||||
|
25 | return 12345
|
||||||
|
26 | })
|
|
@ -0,0 +1,28 @@
|
||||||
|
pub type FnArrayInit = fn (idx int) T
|
||||||
|
|
||||||
|
pub fn new_array<T>(len int, initfn FnArrayInit<T>) []T {
|
||||||
|
mut res := []T{len: len}
|
||||||
|
for idx in 0 .. res.len {
|
||||||
|
res[idx] = initfn(idx)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Point3D {
|
||||||
|
x f32
|
||||||
|
y f32
|
||||||
|
z f32
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// this works as expected:
|
||||||
|
good_cloud := new_array<Point3D>(3, fn (idx int) Point3D {
|
||||||
|
return Point3D{idx, idx * 10, idx * -10}
|
||||||
|
})
|
||||||
|
println(good_cloud)
|
||||||
|
// this should be a compilation error, because the function signature does not match:
|
||||||
|
bad_cloud := new_array<Point3D>(3, fn (idx int) f64 {
|
||||||
|
return 12345
|
||||||
|
})
|
||||||
|
println(bad_cloud)
|
||||||
|
}
|
Loading…
Reference in New Issue