From 2b4160d18c7d05a1b744a56ec6c26c74197382aa Mon Sep 17 00:00:00 2001 From: Jimmi Holst Christensen Date: Tue, 1 May 2018 14:06:31 +0200 Subject: [PATCH 1/3] Fixed extern enums having the wrong size --- src/analyze.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 1ecfe32f4c3e..0f2fdf15de07 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -2325,8 +2325,14 @@ static void resolve_enum_zero_bits(CodeGen *g, TypeTableEntry *enum_type) { HashMap occupied_tag_values = {}; occupied_tag_values.init(field_count); - TypeTableEntry *tag_int_type = get_smallest_unsigned_int_type(g, field_count - 1); + TypeTableEntry *tag_int_type; + if (enum_type->data.enumeration.layout == ContainerLayoutExtern) { + tag_int_type = get_c_int_type(g, CIntTypeInt); + } else { + tag_int_type = get_smallest_unsigned_int_type(g, field_count - 1); + } + // TODO: Are extern enums allowed to have an init_arg_expr? if (decl_node->data.container_decl.init_arg_expr != nullptr) { TypeTableEntry *wanted_tag_int_type = analyze_type_expr(g, scope, decl_node->data.container_decl.init_arg_expr); if (type_is_invalid(wanted_tag_int_type)) { From b54d7987c9cfbd332e7c341cd8b65cad96b92ab7 Mon Sep 17 00:00:00 2001 From: Jimmi Holst Christensen Date: Tue, 1 May 2018 14:35:19 +0200 Subject: [PATCH 2/3] Added tests for extern enum size --- test/cases/enum.zig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/cases/enum.zig b/test/cases/enum.zig index 644c989b0481..3dd749f87e71 100644 --- a/test/cases/enum.zig +++ b/test/cases/enum.zig @@ -392,3 +392,17 @@ test "enum with 1 field but explicit tag type should still have the tag type" { const Enum = enum(u8) { B = 2 }; comptime @import("std").debug.assert(@sizeOf(Enum) == @sizeOf(u8)); } + +test "empty extern enum" { + const E = extern enum { }; + assert(@sizeOf(E) == @sizeOf(c_int)); +} + +test "empty extern enum with members" { + const E = extern enum { + A, + B, + C, + }; + assert(@sizeOf(E) == @sizeOf(c_int)); +} From ab3ea48b0ffd584223be4d1bf6d06871ce531fcc Mon Sep 17 00:00:00 2001 From: Jimmi Holst Christensen Date: Tue, 1 May 2018 14:47:25 +0200 Subject: [PATCH 3/3] Removed empty enum test --- test/cases/enum.zig | 5 ----- 1 file changed, 5 deletions(-) diff --git a/test/cases/enum.zig b/test/cases/enum.zig index 3dd749f87e71..0a2658eaf7b5 100644 --- a/test/cases/enum.zig +++ b/test/cases/enum.zig @@ -393,11 +393,6 @@ test "enum with 1 field but explicit tag type should still have the tag type" { comptime @import("std").debug.assert(@sizeOf(Enum) == @sizeOf(u8)); } -test "empty extern enum" { - const E = extern enum { }; - assert(@sizeOf(E) == @sizeOf(c_int)); -} - test "empty extern enum with members" { const E = extern enum { A,