Commit 67b201982b
Changed files (3)
src
stage1
test
src/stage1/ir.cpp
@@ -11380,9 +11380,11 @@ static Stage1AirInst *ir_analyze_instruction_export(IrAnalyze *ira, Stage1ZirIns
}
break;
case ZigTypeIdEnum:
- if (target->value->type->data.enumeration.layout != ContainerLayoutExtern) {
+ if ((err = type_resolve(ira->codegen, target->value->type, ResolveStatusZeroBitsKnown)))
+ return ira->codegen->invalid_inst_gen;
+ if (!target->value->type->data.enumeration.has_explicit_tag_type) {
ErrorMsg *msg = ir_add_error(ira, target,
- buf_sprintf("exported enum value must be declared extern"));
+ buf_sprintf("exported enum value without explicit integer tag type"));
add_error_note(ira->codegen, msg, target->value->type->data.enumeration.decl_node, buf_sprintf("declared here"));
} else {
want_var_export = true;
@@ -11425,9 +11427,11 @@ static Stage1AirInst *ir_analyze_instruction_export(IrAnalyze *ira, Stage1ZirIns
}
break;
case ZigTypeIdEnum:
- if (type_value->data.enumeration.layout != ContainerLayoutExtern) {
+ if ((err = type_resolve(ira->codegen, type_value, ResolveStatusZeroBitsKnown)))
+ return ira->codegen->invalid_inst_gen;
+ if (!type_value->data.enumeration.has_explicit_tag_type) {
ErrorMsg *msg = ir_add_error(ira, target,
- buf_sprintf("exported enum must be declared extern"));
+ buf_sprintf("exported enum without explicit integer tag type"));
add_error_note(ira->codegen, msg, type_value->data.enumeration.decl_node, buf_sprintf("declared here"));
}
break;
test/behavior/enum_stage1.zig
@@ -423,3 +423,17 @@ test "method call on an enum" {
try S.doTheTest();
comptime try S.doTheTest();
}
+
+test "exporting enum type and value" {
+ const S = struct {
+ const E = enum(c_int) { one, two };
+ comptime {
+ @export(E, .{ .name = "E" });
+ }
+ const e: E = .two;
+ comptime {
+ @export(e, .{ .name = "e" });
+ }
+ };
+ try expect(S.e == .two);
+}
test/compile_errors.zig
@@ -23,6 +23,20 @@ pub fn addCases(ctx: *TestContext) !void {
});
}
+ ctx.objErrStage1("exported enum without explicit integer tag type",
+ \\const E = enum { one, two };
+ \\comptime {
+ \\ @export(E, .{ .name = "E" });
+ \\}
+ \\const e: E = .two;
+ \\comptime {
+ \\ @export(e, .{ .name = "e" });
+ \\}
+ , &.{
+ "tmp.zig:3:13: error: exported enum without explicit integer tag type",
+ "tmp.zig:7:13: error: exported enum value without explicit integer tag type",
+ });
+
ctx.objErrStage1("issue #9346: return outside of function scope",
\\pub const empty = return 1;
, &.{"tmp.zig:1:19: error: 'return' outside function scope"});