From 49838a9f3eee0df33d2994b92875314363b32dfc Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 20 Feb 2019 00:20:04 +0100 Subject: [PATCH] Fix generation of comptime slices By erasing the global_refs field we'd trip any codepath using const_values_equal_ptr to figure if two slices were different. --- src/ir.cpp | 4 +++- test/stage1/behavior/slice.zig | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ir.cpp b/src/ir.cpp index e7b1f2f40e..26bc375003 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -17329,7 +17329,9 @@ static IrInstruction *ir_analyze_instruction_container_init_list(IrAnalyze *ira, if (const_val.special == ConstValSpecialStatic) { IrInstruction *result = ir_const(ira, &instruction->base, nullptr); ConstExprValue *out_val = &result->value; - copy_const_val(out_val, &const_val, true); + // Make sure to pass same_global_refs=false here in order not to + // zero the global_refs field for `result` (#1608) + copy_const_val(out_val, &const_val, false); result->value.type = fixed_size_array_type; for (size_t i = 0; i < elem_count; i += 1) { ConstExprValue *elem_val = &out_val->data.x_array.data.s_none.elements[i]; diff --git a/test/stage1/behavior/slice.zig b/test/stage1/behavior/slice.zig index 19eb570150..7f3d7c95ee 100644 --- a/test/stage1/behavior/slice.zig +++ b/test/stage1/behavior/slice.zig @@ -47,3 +47,16 @@ test "C pointer" { var slice = buf[0..len]; expectEqualSlices(u8, "kjdhfkjdhf", slice); } + +fn sliceSum(comptime q: []const u8) i32 { + comptime var result = 0; + inline for (q) |item| { + result += item; + } + return result; +} + +test "comptime slices are disambiguated" { + expect(sliceSum([]u8{ 1, 2 }) == 3); + expect(sliceSum([]u8{ 3, 4 }) == 7); +}