diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index d9ed8b282d..839b30405e 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -534,6 +534,13 @@ fn (mut p Parser) parse_type() ast.Type { if is_option && sym.info is ast.SumType && sym.info.is_anon { p.error_with_pos('an inline sum type cannot be an Option', option_pos.extend(p.prev_tok.pos())) } + + if is_option && sym.info is ast.Alias && sym.info.parent_type.has_flag(.option) { + alias_type_str := p.table.type_to_str(typ) + parent_type_str := p.table.type_to_str(sym.info.parent_type) + p.error_with_pos('cannot use double options like `?${parent_type_str}`, `?${alias_type_str}` is a double option. use `${alias_type_str}` instead', + option_pos.extend(p.prev_tok.pos())) + } } if is_option { typ = typ.set_flag(.option) diff --git a/vlib/v/parser/tests/option_alias_option_type_err.out b/vlib/v/parser/tests/option_alias_option_type_err.out new file mode 100644 index 0000000000..298062b028 --- /dev/null +++ b/vlib/v/parser/tests/option_alias_option_type_err.out @@ -0,0 +1,6 @@ +vlib/v/parser/tests/option_alias_option_type_err.vv:4:11: error: cannot use double options like `??bool`, `?Foo` is a double option. use `Foo` instead + 2 | + 3 | struct Bar { + 4 | a ?Foo + | ~~~~ + 5 | } diff --git a/vlib/v/parser/tests/option_alias_option_type_err.vv b/vlib/v/parser/tests/option_alias_option_type_err.vv new file mode 100644 index 0000000000..f3afaf34c5 --- /dev/null +++ b/vlib/v/parser/tests/option_alias_option_type_err.vv @@ -0,0 +1,5 @@ +type Foo = ?bool + +struct Bar { + a ?Foo +}