Skip to content

Commit

Permalink
checker: check enum value before use
Browse files Browse the repository at this point in the history
  • Loading branch information
Delta456 committed Jul 23, 2024
1 parent 4fc6dd1 commit a262f5c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
8 changes: 8 additions & 0 deletions vlib/v/checker/checker.v
Original file line number Diff line number Diff line change
Expand Up @@ -1932,6 +1932,14 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
c.error('the type of an enum value must be an integer type, like i8, u8, int, u64 etc.',
field.expr.pos)
}
if mut field.expr.expr is ast.EnumVal {
if field.expr.expr.enum_name == node.name {
if field.expr.expr.val !in seen_enum_field_names {
c.error('`${field.expr.expr.enum_name}.${field.expr.expr.val}` should be declared before using it',
field.expr.pos)
}
}
}
}
else {
if mut field.expr is ast.Ident {
Expand Down
6 changes: 6 additions & 0 deletions vlib/v/checker/tests/enum_value_used_before_decl_err.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
vlib/v/checker/tests/enum_value_used_before_decl_err.vv:2:10: error: cannot use `TestEnum.a` as not defined or declared later
1 | enum TestEnum {
2 | chan = int(TestEnum.a)
| ~~~~~~~~~~~~~~~
3 | a = 0
4 | b = 1
5 changes: 5 additions & 0 deletions vlib/v/checker/tests/enum_value_used_before_decl_err.vv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
enum TestEnum {
chan = int(TestEnum.a)
a = 0
b = 1
}

0 comments on commit a262f5c

Please sign in to comment.