aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorSahnvour <sahnvour@pm.me>2019-09-07 13:22:33 +0200
committerAndrew Kelley <andrew@ziglang.org>2019-09-10 10:11:49 -0400
commita06f84fcc62396dc4216d5c9f8da1f0463d17f50 (patch)
treed0f79e75022da043c0d7fa481899260e4cef4b96 /src/analyze.cpp
parent8bd5681651f64c7ebe059e6d7b288ddc60658cd5 (diff)
downloadzig-a06f84fcc62396dc4216d5c9f8da1f0463d17f50.tar.gz
zig-a06f84fcc62396dc4216d5c9f8da1f0463d17f50.zip
forbid opaque types in function return types
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp32
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: