diff --git a/src/ir.cpp b/src/ir.cpp index ce044aa0f3884cf70ae0376b83501b8364fca480..f4b727412ea0d55ce2e0ef3dbe5b400b0832b77f 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -11187,6 +11187,13 @@ static IrInstruction *ir_get_deref(IrAnalyze *ira, IrInstruction *source_instruc } } } + // dereferencing a *u0 is comptime known to be 0 + if (child_type->id == ZigTypeIdInt && child_type->data.integral.bit_count == 0) { + IrInstruction *result = ir_create_const(&ira->new_irb, source_instruction->scope, + source_instruction->source_node, child_type); + init_const_unsigned_negative(&result->value, child_type, 0, false); + return result; + } // TODO if the instruction is a const ref instruction we can skip it IrInstruction *load_ptr_instruction = ir_build_load_ptr(&ira->new_irb, source_instruction->scope, source_instruction->source_node, ptr); diff --git a/test/cases/eval.zig b/test/cases/eval.zig index 7e9c9a739d308615b6e0c0f44aff8e66b102f15c..7f8ad8ed0746c7657c56c07aee1b2d4a45e9497f 100644 --- a/test/cases/eval.zig +++ b/test/cases/eval.zig @@ -682,3 +682,9 @@ test "refer to the type of a generic function" { } fn doNothingWithType(comptime T: type) void {} + +test "zero extend from u0 to u1" { + var zero_u0: u0 = 0; + var zero_u1: u1 = zero_u0; + assert(zero_u1 == 0); +}