authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-04-22 16:54:11+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-22 14:40:57-04:00
logb5e72c0148e40df418bdc8e1770b1bd42e76732e
tree69c741c4fcc2bef40e7b6031ae6eea25b67588db
parent173a143dd04f9ec75355c04be9b0e6353ee9bc03

stage1: Prevent the creation of illegal pointer types

Changing the pointer length from Unknown to Single/C now resets the sentinel value too. Closes #5134

3 files changed, 10 insertions(+), 3 deletions(-)

src/analyze.cpp+1
...@@ -578,6 +578,7 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con...@@ -578,6 +578,7 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
578 }578 }
579 switch (ptr_len) {579 switch (ptr_len) {
580 case PtrLenSingle:580 case PtrLenSingle:
581 assert(sentinel == nullptr);
581 buf_appendf(&entry->name, "*");582 buf_appendf(&entry->name, "*");
582 break;583 break;
583 case PtrLenUnknown:584 case PtrLenUnknown:
src/ir.cpp+1-1
...@@ -21090,7 +21090,7 @@ static ZigType *adjust_ptr_len(CodeGen *g, ZigType *ptr_type, PtrLen ptr_len) {...@@ -21090,7 +21090,7 @@ static ZigType *adjust_ptr_len(CodeGen *g, ZigType *ptr_type, PtrLen ptr_len) {
21090 ptr_type->data.pointer.allow_zero,21090 ptr_type->data.pointer.allow_zero,
21091 ptr_type->data.pointer.vector_index,21091 ptr_type->data.pointer.vector_index,
21092 ptr_type->data.pointer.inferred_struct_field,21092 ptr_type->data.pointer.inferred_struct_field,
21093 ptr_type->data.pointer.sentinel);21093 (ptr_len != PtrLenUnknown) ? nullptr : ptr_type->data.pointer.sentinel);
21094}21094}
2109521095
21096static ZigType *adjust_ptr_allow_zero(CodeGen *g, ZigType *ptr_type, bool allow_zero) {21096static ZigType *adjust_ptr_allow_zero(CodeGen *g, ZigType *ptr_type, bool allow_zero) {
test/stage1/behavior/pointers.zig+8-2
...@@ -1,6 +1,7 @@...@@ -1,6 +1,7 @@
1const std = @import("std");1const std = @import("std");
2const expect = std.testing.expect;2const testing = std.testing;
3const expectError = std.testing.expectError;3const expect = testing.expect;
4const expectError = testing.expectError;
45
5test "dereference pointer" {6test "dereference pointer" {
6 comptime testDerefPtr();7 comptime testDerefPtr();
...@@ -331,3 +332,8 @@ test "@ptrToInt on null optional at comptime" {...@@ -331,3 +332,8 @@ test "@ptrToInt on null optional at comptime" {
331 comptime expect(0xf00 == @ptrToInt(pointer));332 comptime expect(0xf00 == @ptrToInt(pointer));
332 }333 }
333}334}
335
336test "indexing array with sentinel returns correct type" {
337 var s: [:0]const u8 = "abc";
338 testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0])));
339}