diff --git a/src/ir.cpp b/src/ir.cpp index 69b955aef796..a52aaa20863b 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -15995,6 +15995,10 @@ static TypeTableEntry *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstructio init_const_ptr_array(ira->codegen, ptr_val, array_val, index, is_const); if (array_type->id == TypeTableEntryIdArray) { ptr_val->data.x_ptr.mut = ptr_ptr->value.data.x_ptr.mut; + } else if (is_slice(array_type)) { + ptr_val->data.x_ptr.mut = parent_ptr->data.x_ptr.mut; + } else if (array_type->id == TypeTableEntryIdPointer) { + ptr_val->data.x_ptr.mut = parent_ptr->data.x_ptr.mut; } } else if (ptr_is_undef) { ptr_val->type = get_pointer_to_type(ira->codegen, parent_ptr->type->data.pointer.child_type, diff --git a/test/cases/eval.zig b/test/cases/eval.zig index ef6fa73ce310..e499e1ee1fa1 100644 --- a/test/cases/eval.zig +++ b/test/cases/eval.zig @@ -469,3 +469,20 @@ fn doesAlotT(comptime T: type, value: usize) T { test "@setEvalBranchQuota at same scope as generic function call" { assert(doesAlotT(u32, 2) == 2); } + +test "comptime slice of slice preserves comptime var" { + comptime { + var buff: [10]u8 = undefined; + buff[0..][0..][0] = 1; + assert(buff[0..][0..][0] == 1); + } +} + +test "comptime slice of pointer preserves comptime var" { + comptime { + var buff: [10]u8 = undefined; + var a = &buff[0]; + a[0..1][0] = 1; + assert(buff[0..][0..][0] == 1); + } +}