diff --git a/vlib/v/parser/comptime.v b/vlib/v/parser/comptime.v index 63989db830..999226c1a2 100644 --- a/vlib/v/parser/comptime.v +++ b/vlib/v/parser/comptime.v @@ -361,6 +361,11 @@ fn (mut p Parser) comptime_for() ast.ComptimeFor { mut typ_pos := p.tok.pos() lang := p.parse_language() mut typ := ast.void_type + + if p.tok.lit.len == 0 { + p.error('invalid expr, use `${p.peek_tok.lit}` instead') + return ast.ComptimeFor{} + } if p.tok.lit[0].is_capital() || p.tok.lit in p.imports { typ = p.parse_any_type(lang, false, true, false) } else { diff --git a/vlib/v/parser/tests/comptime_for_invalid_expr_err.out b/vlib/v/parser/tests/comptime_for_invalid_expr_err.out new file mode 100644 index 0000000000..698f7cff19 --- /dev/null +++ b/vlib/v/parser/tests/comptime_for_invalid_expr_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/comptime_for_invalid_expr_err.vv:19:12: error: invalid expr, use `MyStruct` instead + 17 | } + 18 | + 19 | $for f in $MyStruct.fields { + | ^ + 20 | assert a.${f.field_name} == b.${f.field_name} + 21 | } diff --git a/vlib/v/parser/tests/comptime_for_invalid_expr_err.vv b/vlib/v/parser/tests/comptime_for_invalid_expr_err.vv new file mode 100644 index 0000000000..ba432138dd --- /dev/null +++ b/vlib/v/parser/tests/comptime_for_invalid_expr_err.vv @@ -0,0 +1,22 @@ +module main + +struct MyStruct { + f_u8 u8 + f_u16 u16 +} + +fn main() { + a := MyStruct { + f_u8 : u8(12) + f_u16 : u16(32) + } + + b := MyStruct { + f_u8 : u8(12) + f_u16 : u16(32) + } + + $for f in $MyStruct.fields { + assert a.${f.field_name} == b.${f.field_name} + } +}