aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorVexu <git@vexu.eu>2020-01-15 21:38:11 +0200
committerVexu <git@vexu.eu>2020-01-15 21:38:11 +0200
commitf3d174aa616401117927988dfc499a1762db01a3 (patch)
treedb105e8ce4b8766025f4a3e04357b7e507698497 /src/analyze.cpp
parentb971c7d0ff1c0ef86ac8d6816eb5e115f0d648fa (diff)
downloadzig-f3d174aa616401117927988dfc499a1762db01a3.tar.gz
zig-f3d174aa616401117927988dfc499a1762db01a3.zip
require size for non-exhaustive enums
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp8
1 files changed, 8 insertions, 0 deletions
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;