mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: add error for mismatched types and format character for string interpolation (#15639)
This commit is contained in:
parent
78998a09e4
commit
436b19c408
vlib/v/checker
@ -94,6 +94,13 @@ pub fn (mut c Checker) string_inter_lit(mut node ast.StringInterLiteral) ast.Typ
|
|||||||
c.error('illegal format specifier `${fmt:c}` for type `${c.table.get_type_name(ftyp)}`',
|
c.error('illegal format specifier `${fmt:c}` for type `${c.table.get_type_name(ftyp)}`',
|
||||||
node.fmt_poss[i])
|
node.fmt_poss[i])
|
||||||
}
|
}
|
||||||
|
// v fmt doesn't format this correctly
|
||||||
|
if
|
||||||
|
c.table.final_sym(typ).kind in [.array, .array_fixed, .struct_, .interface_, .none_, .map, .sum_type]
|
||||||
|
&& fmt in [`E`, `F`, `G`, `e`, `f`, `g`, `d`, `u`, `x`, `X`, `o`, `c`, `p`, `b`] {
|
||||||
|
c.error('illegal format specifier `${fmt:c}` for type `${c.table.get_type_name(ftyp)}`',
|
||||||
|
node.fmt_poss[i])
|
||||||
|
}
|
||||||
node.need_fmts[i] = fmt != c.get_default_fmt(ftyp, typ)
|
node.need_fmts[i] = fmt != c.get_default_fmt(ftyp, typ)
|
||||||
}
|
}
|
||||||
// check recursive str
|
// check recursive str
|
||||||
|
55
vlib/v/checker/tests/str_interpol_invalid_err.out
Normal file
55
vlib/v/checker/tests/str_interpol_invalid_err.out
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:8:13: error: illegal format specifier `x` for type `[]int`
|
||||||
|
6 |
|
||||||
|
7 | fn main() {
|
||||||
|
8 | _ = '${[1]:x}'
|
||||||
|
| ^
|
||||||
|
9 | _ = '${[1]!:x}'
|
||||||
|
10 | _ = '${Foo{}:x}'
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:9:14: error: illegal format specifier `x` for type `[1]int`
|
||||||
|
7 | fn main() {
|
||||||
|
8 | _ = '${[1]:x}'
|
||||||
|
9 | _ = '${[1]!:x}'
|
||||||
|
| ^
|
||||||
|
10 | _ = '${Foo{}:x}'
|
||||||
|
11 | _ = '${[1]:f}'
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:10:15: error: illegal format specifier `x` for type `Foo`
|
||||||
|
8 | _ = '${[1]:x}'
|
||||||
|
9 | _ = '${[1]!:x}'
|
||||||
|
10 | _ = '${Foo{}:x}'
|
||||||
|
| ^
|
||||||
|
11 | _ = '${[1]:f}'
|
||||||
|
12 | _ := '${none:F}'
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:11:13: error: illegal format specifier `f` for type `[]int`
|
||||||
|
9 | _ = '${[1]!:x}'
|
||||||
|
10 | _ = '${Foo{}:x}'
|
||||||
|
11 | _ = '${[1]:f}'
|
||||||
|
| ^
|
||||||
|
12 | _ := '${none:F}'
|
||||||
|
13 | _ = '${{"a": "b"}:x}'
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:12:15: error: illegal format specifier `F` for type `none`
|
||||||
|
10 | _ = '${Foo{}:x}'
|
||||||
|
11 | _ = '${[1]:f}'
|
||||||
|
12 | _ := '${none:F}'
|
||||||
|
| ^
|
||||||
|
13 | _ = '${{"a": "b"}:x}'
|
||||||
|
14 | _ = '${Alias(Foo{}):x}'
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:13:20: error: illegal format specifier `x` for type `map[string]string`
|
||||||
|
11 | _ = '${[1]:f}'
|
||||||
|
12 | _ := '${none:F}'
|
||||||
|
13 | _ = '${{"a": "b"}:x}'
|
||||||
|
| ^
|
||||||
|
14 | _ = '${Alias(Foo{}):x}'
|
||||||
|
15 | _ = '${SumType(int(5)):o}'
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:14:22: error: illegal format specifier `x` for type `Alias`
|
||||||
|
12 | _ := '${none:F}'
|
||||||
|
13 | _ = '${{"a": "b"}:x}'
|
||||||
|
14 | _ = '${Alias(Foo{}):x}'
|
||||||
|
| ^
|
||||||
|
15 | _ = '${SumType(int(5)):o}'
|
||||||
|
16 | }
|
||||||
|
vlib/v/checker/tests/str_interpol_invalid_err.vv:15:25: error: illegal format specifier `o` for type `SumType`
|
||||||
|
13 | _ = '${{"a": "b"}:x}'
|
||||||
|
14 | _ = '${Alias(Foo{}):x}'
|
||||||
|
15 | _ = '${SumType(int(5)):o}'
|
||||||
|
| ^
|
||||||
|
16 | }
|
16
vlib/v/checker/tests/str_interpol_invalid_err.vv
Normal file
16
vlib/v/checker/tests/str_interpol_invalid_err.vv
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
struct Foo {}
|
||||||
|
|
||||||
|
type Alias = Foo
|
||||||
|
|
||||||
|
type SumType = Alias | int
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
_ = '${[1]:x}'
|
||||||
|
_ = '${[1]!:x}'
|
||||||
|
_ = '${Foo{}:x}'
|
||||||
|
_ = '${[1]:f}'
|
||||||
|
_ := '${none:F}'
|
||||||
|
_ = '${{"a": "b"}:x}'
|
||||||
|
_ = '${Alias(Foo{}):x}'
|
||||||
|
_ = '${SumType(int(5)):o}'
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user