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...@@ -1757,6 +1757,32 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc
1757 return g->builtin_types.entry_invalid;1757 return g->builtin_types.entry_invalid;
1758 }1758 }
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
1760 if (fn_proto->auto_err_set) {1786 if (fn_proto->auto_err_set) {
1761 ZigType *inferred_err_set_type = get_auto_err_set_type(g, fn_entry);1787 ZigType *inferred_err_set_type = get_auto_err_set_type(g, fn_entry);
1762 if ((err = type_resolve(g, specified_return_type, ResolveStatusSizeKnown)))1788 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...@@ -1782,15 +1808,11 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc
17821808
1783 switch (fn_type_id.return_type->id) {1809 switch (fn_type_id.return_type->id) {
1784 case ZigTypeIdInvalid:1810 case ZigTypeIdInvalid:
1785 zig_unreachable();
1786
1787 case ZigTypeIdUndefined:1811 case ZigTypeIdUndefined:
1788 case ZigTypeIdNull:1812 case ZigTypeIdNull:
1789 case ZigTypeIdArgTuple:1813 case ZigTypeIdArgTuple:
1790 case ZigTypeIdOpaque:1814 case ZigTypeIdOpaque:
1791 add_node_error(g, fn_proto->return_type,1815 zig_unreachable();
1792 buf_sprintf("return type '%s' not allowed", buf_ptr(&fn_type_id.return_type->name)));
1793 return g->builtin_types.entry_invalid;
17941816
1795 case ZigTypeIdComptimeFloat:1817 case ZigTypeIdComptimeFloat:
1796 case ZigTypeIdComptimeInt:1818 case ZigTypeIdComptimeInt:
test/compile_errors.zig+11
...@@ -6556,4 +6556,15 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {...@@ -6556,4 +6556,15 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
6556 ,6556 ,
6557 "tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned",6557 "tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned",
6558 );6558 );
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 );
6559}6570}