zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 1bf2810f338a7bf83455266ef66a535bdc1d4f83 (tree)
parent 49c3922037ef0b913466e707d85a4e085f6e9716
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Mon, 12 Mar 2018 01:21:10 -0400

fix comptime slicing not preserving comptime mutability

 * fix comptime slice of slice not preserving mutatibility
   of the comptime data
 * fix comptime slice of pointer not preserving mutability
   of the comptime data

closes #826

Diffstat:
Msrc/ir.cpp | 4++++
Mtest/cases/eval.zig | 17+++++++++++++++++
2 files changed, 21 insertions(+), 0 deletions(-)

diff --git 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 @@ -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); + } +}