1
0
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:
Swastik Baranwal 2022-09-04 16:45:26 +05:30 committed by GitHub
parent 78998a09e4
commit 436b19c408
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 78 additions and 0 deletions

View File

@ -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)}`',
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)
}
// check recursive str

View 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 | }

View 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}'
}