Commit 09ec720dab

Andrew Kelley <andrew@ziglang.org>
2019-11-24 22:25:26
fix comptime `@ptrCast` of pointers to arrays
1 parent f7574f4
Changed files (2)
src
test
stage1
behavior
src/ir.cpp
@@ -18585,12 +18585,27 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct
                         case ConstPtrSpecialDiscard:
                             zig_unreachable();
                         case ConstPtrSpecialRef:
-                            mem_size = 1;
-                            old_size = 1;
-                            new_index = index;
+                            if (array_ptr_val->data.x_ptr.data.ref.pointee->type->id == ZigTypeIdArray) {
+                                ConstExprValue *array_val = array_ptr_val->data.x_ptr.data.ref.pointee;
+                                new_index = index;
+                                ZigType *array_type = array_val->type;
+                                mem_size = array_type->data.array.len;
+                                if (array_type->data.array.sentinel != nullptr) {
+                                    mem_size += 1;
+                                }
+                                old_size = mem_size;
 
-                            out_val->data.x_ptr.special = ConstPtrSpecialRef;
-                            out_val->data.x_ptr.data.ref.pointee = array_ptr_val->data.x_ptr.data.ref.pointee;
+                                out_val->data.x_ptr.special = ConstPtrSpecialBaseArray;
+                                out_val->data.x_ptr.data.base_array.array_val = array_val;
+                                out_val->data.x_ptr.data.base_array.elem_index = new_index;
+                            } else {
+                                mem_size = 1;
+                                old_size = 1;
+                                new_index = index;
+
+                                out_val->data.x_ptr.special = ConstPtrSpecialRef;
+                                out_val->data.x_ptr.data.ref.pointee = array_ptr_val->data.x_ptr.data.ref.pointee;
+                            }
                             break;
                         case ConstPtrSpecialBaseArray:
                             {
test/stage1/behavior/pointers.zig
@@ -204,13 +204,12 @@ test "assign null directly to C pointer and test null equality" {
 test "null terminated pointer" {
     const S = struct {
         fn doTheTest() void {
-            var array_with_zero = [_]u8{'h', 'e', 'l', 'l', 'o', 0};
+            var array_with_zero = [_:0]u8{'h', 'e', 'l', 'l', 'o'};
             var zero_ptr: [*:0]const u8 = @ptrCast([*:0]const u8, &array_with_zero);
             var no_zero_ptr: [*]const u8 = zero_ptr;
             expect(std.mem.eql(u8, std.mem.toSliceConst(u8, no_zero_ptr), "hello"));
         }
     };
     S.doTheTest();
-    // TODO test fails at comptime
-    //comptime S.doTheTest();
+    comptime S.doTheTest();
 }