mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
compiler: generic variadic fix
This commit is contained in:
parent
0cf3e2e677
commit
2f5a742f3e
@ -1059,7 +1059,7 @@ fn (p mut Parser) fn_call_args(f mut Fn) {
|
|||||||
// varargs
|
// varargs
|
||||||
varg_type, varg_values := p.fn_call_vargs(f)
|
varg_type, varg_values := p.fn_call_vargs(f)
|
||||||
if f.is_variadic {
|
if f.is_variadic {
|
||||||
saved_args << '...$varg_type'
|
saved_args << varg_type
|
||||||
}
|
}
|
||||||
if p.tok == .comma {
|
if p.tok == .comma {
|
||||||
p.error('wrong number of arguments for fn `$f.name`: expected $f.args.len, but got more')
|
p.error('wrong number of arguments for fn `$f.name`: expected $f.args.len, but got more')
|
||||||
@ -1158,11 +1158,12 @@ fn (p mut Parser) replace_type_params(f &Fn, ti TypeInst) []string {
|
|||||||
fi = fi.right(6)
|
fi = fi.right(6)
|
||||||
fr += 'array_'
|
fr += 'array_'
|
||||||
}
|
}
|
||||||
if fi.starts_with('...') {
|
is_varg := fi.starts_with('...')
|
||||||
fi = fi.right(3)
|
if is_varg { fi = fi.right(3) }
|
||||||
}
|
|
||||||
if fi in ti.inst.keys() {
|
if fi in ti.inst.keys() {
|
||||||
fr += ti.inst[fi]
|
mut t := ti.inst[fi]
|
||||||
|
if is_varg { t = '...$t' }
|
||||||
|
fr += t
|
||||||
// println("replaced $a => $fr")
|
// println("replaced $a => $fr")
|
||||||
} else {
|
} else {
|
||||||
fr += fi
|
fr += fi
|
||||||
|
@ -2,7 +2,7 @@ struct VaTestGroup {
|
|||||||
name string
|
name string
|
||||||
}
|
}
|
||||||
|
|
||||||
fn variadic_test_a(name string, groups ...VaTestGroup) {
|
fn variadic_test(name string, groups ...VaTestGroup) {
|
||||||
assert groups.len == 2
|
assert groups.len == 2
|
||||||
assert groups[0].name == 'users'
|
assert groups[0].name == 'users'
|
||||||
assert groups[1].name == 'admins'
|
assert groups[1].name == 'admins'
|
||||||
@ -11,5 +11,15 @@ fn variadic_test_a(name string, groups ...VaTestGroup) {
|
|||||||
fn test_fn_variadic() {
|
fn test_fn_variadic() {
|
||||||
group1 := VaTestGroup{name: 'users'}
|
group1 := VaTestGroup{name: 'users'}
|
||||||
group2 := VaTestGroup{name: 'admins'}
|
group2 := VaTestGroup{name: 'admins'}
|
||||||
variadic_test_a('joe', group1, group2)
|
variadic_test('joe', group1, group2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn variadic_test_generic<T>(a int, b ...T) T {
|
||||||
|
b1 := b[0]
|
||||||
|
b2 := b[1]
|
||||||
|
return '$a $b1 $b2'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_fn_variadic_generic() {
|
||||||
|
assert variadic_test_generic(111, 'hello', 'v') == '111 hello v'
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user