Commit 0cd953d40e

LemonBoy <thatlemon@gmail.com>
2020-03-23 10:00:46
ir: Prevent crash when slicing hardcoded pointer
Closes #4780
1 parent 13d04f9
Changed files (2)
src
test
stage1
behavior
src/ir.cpp
@@ -12819,7 +12819,7 @@ static IrInstGen *ir_resolve_ptr_of_array_to_slice(IrAnalyze *ira, IrInst* sourc
                 result->value->type = wanted_type;
                 return result;
             }
-        } else {
+        } else if (array_ptr_val->data.x_ptr.special != ConstPtrSpecialHardCodedAddr) {
             ZigValue *pointee = const_ptr_pointee(ira, ira->codegen, array_ptr_val, source_instr->source_node);
             if (pointee == nullptr)
                 return ira->codegen->invalid_inst_gen;
test/stage1/behavior/slice.zig
@@ -285,3 +285,17 @@ test "slice syntax resulting in pointer-to-array" {
     S.doTheTest();
     comptime S.doTheTest();
 }
+
+test "slice of hardcoded address to pointer" {
+    const S = struct {
+        fn doTheTest() void {
+            const pointer = @intToPtr([*]u8, 0x04)[0..2];
+            comptime expect(@TypeOf(pointer) == *[2]u8);
+            const slice: []const u8 = pointer;
+            expect(@ptrToInt(slice.ptr) == 4);
+            expect(slice.len == 2);
+        }
+    };
+
+    S.doTheTest();
+}