diff options
| author | Sahnvour <sahnvour@pm.me> | 2019-09-07 13:22:33 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-09-10 10:11:49 -0400 |
| commit | a06f84fcc62396dc4216d5c9f8da1f0463d17f50 (patch) | |
| tree | d0f79e75022da043c0d7fa481899260e4cef4b96 /src/analyze.cpp | |
| parent | 8bd5681651f64c7ebe059e6d7b288ddc60658cd5 (diff) | |
| download | zig-a06f84fcc62396dc4216d5c9f8da1f0463d17f50.tar.gz zig-a06f84fcc62396dc4216d5c9f8da1f0463d17f50.zip | |
forbid opaque types in function return types
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 2dfb540801..e06faba7a9 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -1757,6 +1757,32 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc return g->builtin_types.entry_invalid; } + switch (specified_return_type->id) { + case ZigTypeIdInvalid: + zig_unreachable(); + + case ZigTypeIdUndefined: + case ZigTypeIdNull: + case ZigTypeIdArgTuple: + add_node_error(g, fn_proto->return_type, + buf_sprintf("return type '%s' not allowed", buf_ptr(&specified_return_type->name))); + return g->builtin_types.entry_invalid; + + case ZigTypeIdOpaque: + { + ErrorMsg* msg = add_node_error(g, fn_proto->return_type, + buf_sprintf("opaque return type '%s' not allowed", buf_ptr(&specified_return_type->name))); + Tld *tld = find_decl(g, &fn_entry->fndef_scope->base, &specified_return_type->name); + if (tld != nullptr) { + add_error_note(g, msg, tld->source_node, buf_sprintf("declared here")); + } + return g->builtin_types.entry_invalid; + } + + default: + break; + } + if (fn_proto->auto_err_set) { ZigType *inferred_err_set_type = get_auto_err_set_type(g, fn_entry); if ((err = type_resolve(g, specified_return_type, ResolveStatusSizeKnown))) @@ -1782,15 +1808,11 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc switch (fn_type_id.return_type->id) { case ZigTypeIdInvalid: - zig_unreachable(); - case ZigTypeIdUndefined: case ZigTypeIdNull: case ZigTypeIdArgTuple: case ZigTypeIdOpaque: - add_node_error(g, fn_proto->return_type, - buf_sprintf("return type '%s' not allowed", buf_ptr(&fn_type_id.return_type->name))); - return g->builtin_types.entry_invalid; + zig_unreachable(); case ZigTypeIdComptimeFloat: case ZigTypeIdComptimeInt: |
