authorgravatar for me@tadeo.caTadeo Kondrak <me@tadeo.ca> 2020-09-25 17:14:13-06:00
committergravatar for me@tadeo.caTadeo Kondrak <me@tadeo.ca> 2020-10-06 22:08:27-06:00
logd71f339395f8a3a3c09bbb2d51e6f35cb5295d14
tree1272c38ac11e5276ed5d0e94753b21ed9a6509ee
parentd5b8172a82f5b301b518501958ca1db11d07bc38
signaturelock-open Commit is signed but in an unrecognized format.

stage1: disallow fields in opaque types


2 files changed, 22 insertions(+), 4 deletions(-)

src/stage1/analyze.cpp+12-4
......@@ -3457,10 +3457,18 @@ static Error resolve_union_zero_bits(CodeGen *g, ZigType *union_type) {
34573457}
34583458
34593459static Error resolve_opaque_type(CodeGen *g, ZigType *opaque_type) {
3460 opaque_type->abi_align = UINT32_MAX;
3461 opaque_type->abi_size = SIZE_MAX;
3462 opaque_type->size_in_bits = SIZE_MAX;
3463 return ErrorNone;
3460 Error err = ErrorNone;
3461 AstNode *container_node = opaque_type->data.opaque.decl_node;
3462 if (container_node != nullptr) {
3463 assert(container_node->type == NodeTypeContainerDecl);
3464 AstNodeContainerDecl *container_decl = &container_node->data.container_decl;
3465 for (int i = 0; i < container_decl->fields.length; i++) {
3466 AstNode *field_node = container_decl->fields.items[i];
3467 add_node_error(g, field_node, buf_create_from_str("opaque types cannot have fields"));
3468 err = ErrorSemanticAnalyzeFail;
3469 }
3470 }
3471 return err;
34643472}
34653473
34663474void append_namespace_qualification(CodeGen *g, Buf *buf, ZigType *container_type) {
test/compile_errors.zig+10
......@@ -125,6 +125,16 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
125125 "tmp.zig:15:23: error: enum field missing: 'arst'",
126126 "tmp.zig:27:24: note: referenced here",
127127 });
128
129 cases.add("opaque type with field",
130 \\const Opaque = opaque { foo: i32 };
131 \\export fn entry() void {
132 \\ const foo: ?*Opaque = null;
133 \\}
134 , &[_][]const u8{
135 "tmp.zig:1:25: error: opaque types cannot have fields",
136 });
137
128138 cases.add("@Type(.Fn) with is_generic = true",
129139 \\const Foo = @Type(.{
130140 \\ .Fn = .{