Skip to content

Commit 0ccc186

Browse files
committed
disable field access for unknown length pointers
See #770
1 parent bbb565a commit 0ccc186

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/analyze.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3753,13 +3753,13 @@ static bool is_container(TypeTableEntry *type_entry) {
37533753
}
37543754

37553755
bool 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) ?
37573757
is_container(type_entry->data.pointer.child_type) : is_container(type_entry);
37583758
}
37593759

37603760
TypeTableEntry *container_ref_type(TypeTableEntry *type_entry) {
37613761
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) ?
37633763
type_entry->data.pointer.child_type : type_entry;
37643764
}
37653765

test/compile_errors.zig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
const tests = @import("tests.zig");
22

33
pub 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+
417
cases.add(
518
"unknown length pointer to opaque",
619
\\export const T = [*]@OpaqueType();

0 commit comments

Comments
 (0)