authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-05 20:18:26-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-05 20:18:26-04:00
log83390bdfdde211a73be42e16a41cd2102c429bbd
tree17854868d8d75183e653f9ab630f5c8569215ec3
parent3854bb919808b8d86154495fee1acc7e645240a4
signaturelock-open Commit is signed but in an unrecognized format.

fix dereferencing a zero bit type

Before only u0 was special cased in handling a dereference; now all zero bit types are handled the same way. Dereferencing a pointer to a zero bit type always gives a comptime-known result. This previously had been failing on master branch but went unnoticed because until 846f72b57cb5 the CI server was mistakenly not actually running the single-threaded tests with --single-threaded. This fixes the standard library tests with --single-threaded --release-fast.

1 files changed, 17 insertions(+), 14 deletions(-)

src/ir.cpp+17-14
......@@ -10702,15 +10702,6 @@ static IrInstruction *ir_analyze_enum_to_int(IrAnalyze *ira, IrInstruction *sour
1070210702 ZigType *tag_type = enum_type->data.enumeration.tag_int_type;
1070310703 assert(tag_type->id == ZigTypeIdInt || tag_type->id == ZigTypeIdComptimeInt);
1070410704
10705 if (instr_is_comptime(enum_target)) {
10706 ConstExprValue *val = ir_resolve_const(ira, enum_target, UndefBad);
10707 if (!val)
10708 return ira->codegen->invalid_instruction;
10709 IrInstruction *result = ir_const(ira, source_instr, tag_type);
10710 init_const_bigint(&result->value, tag_type, &val->data.x_enum_tag);
10711 return result;
10712 }
10713
1071410705 // If there is only one possible tag, then we know at comptime what it is.
1071510706 if (enum_type->data.enumeration.layout == ContainerLayoutAuto &&
1071610707 enum_type->data.enumeration.src_field_count == 1)
......@@ -10722,6 +10713,15 @@ static IrInstruction *ir_analyze_enum_to_int(IrAnalyze *ira, IrInstruction *sour
1072210713 return result;
1072310714 }
1072410715
10716 if (instr_is_comptime(enum_target)) {
10717 ConstExprValue *val = ir_resolve_const(ira, enum_target, UndefBad);
10718 if (!val)
10719 return ira->codegen->invalid_instruction;
10720 IrInstruction *result = ir_const(ira, source_instr, tag_type);
10721 init_const_bigint(&result->value, tag_type, &val->data.x_enum_tag);
10722 return result;
10723 }
10724
1072510725 IrInstruction *result = ir_build_widen_or_shorten(&ira->new_irb, source_instr->scope,
1072610726 source_instr->source_node, enum_target);
1072710727 result->value.type = tag_type;
......@@ -11809,11 +11809,14 @@ static IrInstruction *ir_get_deref(IrAnalyze *ira, IrInstruction *source_instruc
1180911809 return ira->codegen->invalid_instruction;
1181011810 } else if (type_entry->id == ZigTypeIdPointer) {
1181111811 ZigType *child_type = type_entry->data.pointer.child_type;
11812 // dereferencing a *u0 is comptime known to be 0
11813 if (child_type->id == ZigTypeIdInt && child_type->data.integral.bit_count == 0) {
11814 IrInstruction *result = ir_const(ira, source_instruction, child_type);
11815 init_const_unsigned_negative(&result->value, child_type, 0, false);
11816 return result;
11812 // if the child type has one possible value, the deref is comptime
11813 switch (type_has_one_possible_value(ira->codegen, child_type)) {
11814 case OnePossibleValueInvalid:
11815 return ira->codegen->invalid_instruction;
11816 case OnePossibleValueYes:
11817 return ir_const(ira, source_instruction, child_type);
11818 case OnePossibleValueNo:
11819 break;
1181711820 }
1181811821 if (instr_is_comptime(ptr)) {
1181911822 if (ptr->value.special == ConstValSpecialUndef) {