diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-01-18 19:25:23 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-18 19:25:23 -0500 |
| commit | 7bb4c855ad3776d7f7d21f2bf1c5c93366205ff2 (patch) | |
| tree | 1695efe0e849848743d3c152f4349b054a7bf96e /src | |
| parent | 405b8e9eeefda07b16044690471cfd57fc654c75 (diff) | |
| parent | b0f753e21d6fcaafd0b35dc02fdfe23b14e310d6 (diff) | |
| download | zig-7bb4c855ad3776d7f7d21f2bf1c5c93366205ff2.tar.gz zig-7bb4c855ad3776d7f7d21f2bf1c5c93366205ff2.zip | |
Merge pull request #4222 from LemonBoy/eutwouwth
Prevent crash with empty non-exhaustive enum
Diffstat (limited to 'src')
| -rw-r--r-- | src/analyze.cpp | 2 | ||||
| -rw-r--r-- | src/ir.cpp | 11 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index e064677a09..0bbec66a9b 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -8312,7 +8312,7 @@ static void resolve_llvm_types_enum(CodeGen *g, ZigType *enum_type, ResolveStatu uint32_t field_count = enum_type->data.enumeration.src_field_count; - assert(enum_type->data.enumeration.fields); + assert(field_count == 0 || enum_type->data.enumeration.fields != nullptr); ZigLLVMDIEnumerator **di_enumerators = allocate<ZigLLVMDIEnumerator*>(field_count); for (uint32_t i = 0; i < field_count; i += 1) { diff --git a/src/ir.cpp b/src/ir.cpp index 42a5043279..db1faac37c 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -21614,7 +21614,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira, case ZigTypeIdEnum: { if ((err = type_resolve(ira->codegen, target_type, ResolveStatusZeroBitsKnown))) return ira->codegen->invalid_instruction; - if (target_type->data.enumeration.src_field_count < 2) { + if (target_type->data.enumeration.src_field_count == 1) { TypeEnumField *only_field = &target_type->data.enumeration.fields[0]; IrInstruction *result = ir_const(ira, &switch_target_instruction->base, target_type); bigint_init_bigint(&result->value->data.x_enum_tag, &only_field->value); @@ -22351,6 +22351,15 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns assert(target->value->type->id == ZigTypeIdEnum); + if (target->value->type->data.enumeration.src_field_count == 1 && + !target->value->type->data.enumeration.non_exhaustive) { + TypeEnumField *only_field = &target->value->type->data.enumeration.fields[0]; + ZigValue *array_val = create_const_str_lit(ira->codegen, only_field->name)->data.x_ptr.data.ref.pointee; + IrInstruction *result = ir_const(ira, &instruction->base, nullptr); + init_const_slice(ira->codegen, result->value, array_val, 0, buf_len(only_field->name), true); + return result; + } + if (instr_is_comptime(target)) { if ((err = type_resolve(ira->codegen, target->value->type, ResolveStatusZeroBitsKnown))) return ira->codegen->invalid_instruction; |
