Commit 49838a9f3e

LemonBoy <thatlemon@gmail.com>
2019-02-20 00:20:04
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.
1 parent 1ed38a6
Changed files (2)
src
test
stage1
behavior
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];
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);
+}