Prevent crash in tagged enums rendering (#1986)

* Prevent crash in tagged enums rendering

* Add a test case
master
LemonBoy 2019-02-19 21:18:57 +01:00 committed by Andrew Kelley
parent db74832e40
commit 400006bbe7
2 changed files with 19 additions and 2 deletions

View File

@ -6276,8 +6276,8 @@ void render_const_value(CodeGen *g, Buf *buf, ConstExprValue *const_val) {
}
case ZigTypeIdUnion:
{
uint64_t tag = bigint_as_unsigned(&const_val->data.x_union.tag);
TypeUnionField *field = &type_entry->data.unionation.fields[tag];
const BigInt *tag = &const_val->data.x_union.tag;
TypeUnionField *field = find_union_field_by_tag(type_entry, tag);
buf_appendf(buf, "%s { .%s = ", buf_ptr(&type_entry->name), buf_ptr(field->name));
render_const_value(g, buf, const_val->data.x_union.payload);
buf_append_str(buf, "}");

View File

@ -5599,4 +5599,21 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
,
".tmp_source.zig:2:26: error: vector element type must be integer, float, or pointer; '@Vector(4, u8)' is invalid",
);
cases.add(
"compileLog of tagged enum doesn't crash the compiler",
\\const Bar = union(enum(u32)) {
\\ X: i32 = 1
\\};
\\
\\fn testCompileLog(x: Bar) void {
\\ @compileLog(x);
\\}
\\
\\pub fn main () void {
\\ comptime testCompileLog(Bar{.X = 123});
\\}
,
".tmp_source.zig:6:5: error: found compile log statement"
);
}