From f3d174aa616401117927988dfc499a1762db01a3 Mon Sep 17 00:00:00 2001 From: Vexu Date: Wed, 15 Jan 2020 21:38:11 +0200 Subject: require size for non-exhaustive enums --- src/analyze.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/analyze.cpp') diff --git a/src/analyze.cpp b/src/analyze.cpp index a62e0414e0..0b2b6ddeaa 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -2652,6 +2652,14 @@ static Error resolve_enum_zero_bits(CodeGen *g, ZigType *enum_type) { AstNode *tag_value = field_node->data.struct_field.value; if (buf_eql_str(type_enum_field->name, "_")) { + if (decl_node->data.container_decl.init_arg_expr == nullptr) { + add_node_error(g, field_node, buf_sprintf("non-exhaustive enum must specify size")); + enum_type->data.enumeration.resolve_status = ResolveStatusInvalid; + } + if (log2_u64(field_count - 1) == enum_type->size_in_bits) { + add_node_error(g, field_node, buf_sprintf("non-exhaustive enum specifies every value")); + enum_type->data.enumeration.resolve_status = ResolveStatusInvalid; + } if (field_i != field_count - 1) { add_node_error(g, field_node, buf_sprintf("'_' field of non-exhaustive enum must be last")); enum_type->data.enumeration.resolve_status = ResolveStatusInvalid; -- cgit v1.2.3