authorgravatar for sahnvour@pm.meSahnvour <sahnvour@pm.me> 2019-09-07 13:22:33+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-09-10 10:11:49-04:00
loga06f84fcc62396dc4216d5c9f8da1f0463d17f50
treed0f79e75022da043c0d7fa481899260e4cef4b96
parent8bd5681651f64c7ebe059e6d7b288ddc60658cd5

forbid opaque types in function return types


2 files changed, 38 insertions(+), 5 deletions(-)

src/analyze.cpp+27-5
......@@ -1757,6 +1757,32 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc
17571757 return g->builtin_types.entry_invalid;
17581758 }
17591759
1760 switch (specified_return_type->id) {
1761 case ZigTypeIdInvalid:
1762 zig_unreachable();
1763
1764 case ZigTypeIdUndefined:
1765 case ZigTypeIdNull:
1766 case ZigTypeIdArgTuple:
1767 add_node_error(g, fn_proto->return_type,
1768 buf_sprintf("return type '%s' not allowed", buf_ptr(&specified_return_type->name)));
1769 return g->builtin_types.entry_invalid;
1770
1771 case ZigTypeIdOpaque:
1772 {
1773 ErrorMsg* msg = add_node_error(g, fn_proto->return_type,
1774 buf_sprintf("opaque return type '%s' not allowed", buf_ptr(&specified_return_type->name)));
1775 Tld *tld = find_decl(g, &fn_entry->fndef_scope->base, &specified_return_type->name);
1776 if (tld != nullptr) {
1777 add_error_note(g, msg, tld->source_node, buf_sprintf("declared here"));
1778 }
1779 return g->builtin_types.entry_invalid;
1780 }
1781
1782 default:
1783 break;
1784 }
1785
17601786 if (fn_proto->auto_err_set) {
17611787 ZigType *inferred_err_set_type = get_auto_err_set_type(g, fn_entry);
17621788 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
17821808
17831809 switch (fn_type_id.return_type->id) {
17841810 case ZigTypeIdInvalid:
1785 zig_unreachable();
1786
17871811 case ZigTypeIdUndefined:
17881812 case ZigTypeIdNull:
17891813 case ZigTypeIdArgTuple:
17901814 case ZigTypeIdOpaque:
1791 add_node_error(g, fn_proto->return_type,
1792 buf_sprintf("return type '%s' not allowed", buf_ptr(&fn_type_id.return_type->name)));
1793 return g->builtin_types.entry_invalid;
1815 zig_unreachable();
17941816
17951817 case ZigTypeIdComptimeFloat:
17961818 case ZigTypeIdComptimeInt:
test/compile_errors.zig+11
......@@ -6556,4 +6556,15 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
65566556 ,
65576557 "tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned",
65586558 );
6559
6560 cases.add(
6561 "function returning opaque type",
6562 \\const FooType = @OpaqueType();
6563 \\export fn bar() !FooType {
6564 \\ return error.InvalidValue;
6565 \\}
6566 ,
6567 "tmp.zig:2:18: error: opaque return type 'FooType' not allowed",
6568 "tmp.zig:1:1: note: declared here",
6569 );
65596570}