mirror of
https://github.com/vlang/v.git
synced 2025-09-13 14:32:26 +03:00
Compare commits
2 commits
7c780ed8fa
...
d31aaecc42
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d31aaecc42 | ||
![]() |
0dc4e9b46a |
5 changed files with 69 additions and 14 deletions
|
@ -3213,14 +3213,15 @@ fn (mut c Checker) map_builtin_method_call(mut node ast.CallExpr, left_type_ ast
|
||||||
}
|
}
|
||||||
'delete' {
|
'delete' {
|
||||||
c.check_for_mut_receiver(mut node.left)
|
c.check_for_mut_receiver(mut node.left)
|
||||||
if node.args.len != 1 {
|
if node.args.len == 1 {
|
||||||
|
info := left_sym.info as ast.Map
|
||||||
|
arg_type := c.expr(mut node.args[0].expr)
|
||||||
|
c.check_expected_call_arg(arg_type, info.key_type, node.language, node.args[0]) or {
|
||||||
|
c.error('${err.msg()} in argument 1 to `Map.delete`', node.args[0].pos)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
c.error('expected 1 argument, but got ${node.args.len}', node.pos)
|
c.error('expected 1 argument, but got ${node.args.len}', node.pos)
|
||||||
}
|
}
|
||||||
info := left_sym.info as ast.Map
|
|
||||||
arg_type := c.expr(mut node.args[0].expr)
|
|
||||||
c.check_expected_call_arg(arg_type, info.key_type, node.language, node.args[0]) or {
|
|
||||||
c.error('${err.msg()} in argument 1 to `Map.delete`', node.args[0].pos)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,6 +104,10 @@ fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type {
|
||||||
if c.comptime.inside_comptime_for && node.cond.field_name in ['name', 'typ'] {
|
if c.comptime.inside_comptime_for && node.cond.field_name in ['name', 'typ'] {
|
||||||
// hack: `typ` is just for bypass the error test, because we don't know it is a type match or a value match righ now
|
// hack: `typ` is just for bypass the error test, because we don't know it is a type match or a value match righ now
|
||||||
comptime_match_cond_value = c.comptime.comptime_for_field_value.name
|
comptime_match_cond_value = c.comptime.comptime_for_field_value.name
|
||||||
|
} else if mut node.cond.expr is ast.Ident
|
||||||
|
&& node.cond.gkind_field in [.typ, .unaliased_typ] {
|
||||||
|
left_type := c.get_expr_type(node.cond.expr)
|
||||||
|
comptime_match_cond_value = c.table.type_to_str(left_type)
|
||||||
} else {
|
} else {
|
||||||
c.error('`${node.cond}` is not `\$for` field.name.', node.cond.pos)
|
c.error('`${node.cond}` is not `\$for` field.name.', node.cond.pos)
|
||||||
return ast.void_type
|
return ast.void_type
|
||||||
|
|
|
@ -12,16 +12,29 @@ vlib/v/checker/tests/map_delete.vv:6:4: error: expected 1 argument, but got 2
|
||||||
| ~~~~~~~~~~~~
|
| ~~~~~~~~~~~~
|
||||||
7 | m2 := {
|
7 | m2 := {
|
||||||
8 | '1': 1
|
8 | '1': 1
|
||||||
vlib/v/checker/tests/map_delete.vv:6:11: error: cannot use `int literal` as `string` in argument 1 to `Map.delete`
|
|
||||||
4 | }
|
|
||||||
5 | m.delete(1)
|
|
||||||
6 | m.delete(1, 2)
|
|
||||||
| ^
|
|
||||||
7 | m2 := {
|
|
||||||
8 | '1': 1
|
|
||||||
vlib/v/checker/tests/map_delete.vv:10:2: error: `m2` is immutable, declare it with `mut` to make it mutable
|
vlib/v/checker/tests/map_delete.vv:10:2: error: `m2` is immutable, declare it with `mut` to make it mutable
|
||||||
8 | '1': 1
|
8 | '1': 1
|
||||||
9 | }
|
9 | }
|
||||||
10 | m2.delete('1')
|
10 | m2.delete('1')
|
||||||
| ~~
|
| ~~
|
||||||
11 | }
|
11 | m.delete()
|
||||||
|
12 | _ := m.delete()
|
||||||
|
vlib/v/checker/tests/map_delete.vv:11:4: error: expected 1 argument, but got 0
|
||||||
|
9 | }
|
||||||
|
10 | m2.delete('1')
|
||||||
|
11 | m.delete()
|
||||||
|
| ~~~~~~~~
|
||||||
|
12 | _ := m.delete()
|
||||||
|
13 | }
|
||||||
|
vlib/v/checker/tests/map_delete.vv:12:9: error: expected 1 argument, but got 0
|
||||||
|
10 | m2.delete('1')
|
||||||
|
11 | m.delete()
|
||||||
|
12 | _ := m.delete()
|
||||||
|
| ~~~~~~~~
|
||||||
|
13 | }
|
||||||
|
vlib/v/checker/tests/map_delete.vv:12:4: error: assignment mismatch: 1 variable but `delete()` returns 0 values
|
||||||
|
10 | m2.delete('1')
|
||||||
|
11 | m.delete()
|
||||||
|
12 | _ := m.delete()
|
||||||
|
| ~~
|
||||||
|
13 | }
|
||||||
|
|
|
@ -8,4 +8,6 @@ fn main() {
|
||||||
'1': 1
|
'1': 1
|
||||||
}
|
}
|
||||||
m2.delete('1')
|
m2.delete('1')
|
||||||
|
m.delete()
|
||||||
|
_ := m.delete()
|
||||||
}
|
}
|
||||||
|
|
35
vlib/v/tests/comptime/comptime_match_unaliased_typ_test.v
Normal file
35
vlib/v/tests/comptime/comptime_match_unaliased_typ_test.v
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
fn check_unaliased[T](t T) bool {
|
||||||
|
$match T.unaliased_typ {
|
||||||
|
int {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
$else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_typ[T](t T) bool {
|
||||||
|
$match T.typ {
|
||||||
|
int {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
$else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type FooInt = int
|
||||||
|
|
||||||
|
fn test_main() {
|
||||||
|
assert check_unaliased(1)
|
||||||
|
assert !check_unaliased('')
|
||||||
|
assert !check_unaliased(1.2)
|
||||||
|
assert check_unaliased(FooInt(0))
|
||||||
|
|
||||||
|
assert check_typ(1)
|
||||||
|
assert !check_typ('')
|
||||||
|
assert !check_typ(1.2)
|
||||||
|
assert !check_typ(FooInt(0))
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue