authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-06-05 20:24:11-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-06-05 23:26:43-04:00
log0ccc18686921dce8e7f2feb95eed83b894ca8df4
treef41d5aa70377acd832edb05243f00ea91ff51d82
parentbbb565a21e40f305b9fa10c385124455fafe647f

disable field access for unknown length pointers

See #770

2 files changed, 15 insertions(+), 2 deletions(-)

src/analyze.cpp+2-2
...@@ -3753,13 +3753,13 @@ static bool is_container(TypeTableEntry *type_entry) {...@@ -3753,13 +3753,13 @@ static bool is_container(TypeTableEntry *type_entry) {
3753}3753}
37543754
3755bool is_container_ref(TypeTableEntry *type_entry) {3755bool is_container_ref(TypeTableEntry *type_entry) {
3756 return (type_entry->id == TypeTableEntryIdPointer) ?3756 return (type_entry->id == TypeTableEntryIdPointer && type_entry->data.pointer.ptr_len == PtrLenSingle) ?
3757 is_container(type_entry->data.pointer.child_type) : is_container(type_entry);3757 is_container(type_entry->data.pointer.child_type) : is_container(type_entry);
3758}3758}
37593759
3760TypeTableEntry *container_ref_type(TypeTableEntry *type_entry) {3760TypeTableEntry *container_ref_type(TypeTableEntry *type_entry) {
3761 assert(is_container_ref(type_entry));3761 assert(is_container_ref(type_entry));
3762 return (type_entry->id == TypeTableEntryIdPointer) ?3762 return (type_entry->id == TypeTableEntryIdPointer && type_entry->data.pointer.ptr_len == PtrLenSingle) ?
3763 type_entry->data.pointer.child_type : type_entry;3763 type_entry->data.pointer.child_type : type_entry;
3764}3764}
37653765
test/compile_errors.zig+13
...@@ -1,6 +1,19 @@...@@ -1,6 +1,19 @@
1const tests = @import("tests.zig");1const tests = @import("tests.zig");
22
3pub fn addCases(cases: *tests.CompileErrorContext) void {3pub fn addCases(cases: *tests.CompileErrorContext) void {
4 cases.add(
5 "field access of unknown length pointer",
6 \\const Foo = extern struct {
7 \\ a: i32,
8 \\};
9 \\
10 \\export fn entry(foo: [*]Foo) void {
11 \\ foo.a += 1;
12 \\}
13 ,
14 ".tmp_source.zig:6:8: error: type '[*]Foo' does not support field access",
15 );
16
4 cases.add(17 cases.add(
5 "unknown length pointer to opaque",18 "unknown length pointer to opaque",
6 \\export const T = [*]@OpaqueType();19 \\export const T = [*]@OpaqueType();