diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-05-17 12:48:56 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-17 12:48:56 -0400 |
| commit | 9a22c8b6ca98fd01795f8cd4f3e9d92311175f13 (patch) | |
| tree | d580bf0cd72ee38b1b2d9aa0d6255d0de9b4369e /src/analyze.cpp | |
| parent | 03ed9e4173131ac5e6157be500e3c50f7e0b0947 (diff) | |
| parent | 887bf8ba93a9d060e08e3792afd6b5b9dabd9ccf (diff) | |
| download | zig-9a22c8b6ca98fd01795f8cd4f3e9d92311175f13.tar.gz zig-9a22c8b6ca98fd01795f8cd4f3e9d92311175f13.zip | |
Merge pull request #5057 from xackus/opaque-param
stage1: fix assert fail on opaque fn ptr param
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 117 |
1 files changed, 40 insertions, 77 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 39f797a9ec..5a2629a0ea 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -1891,50 +1891,30 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc } } - switch (type_entry->id) { - case ZigTypeIdInvalid: - zig_unreachable(); - case ZigTypeIdUnreachable: - case ZigTypeIdUndefined: - case ZigTypeIdNull: - case ZigTypeIdOpaque: + if(!is_valid_param_type(type_entry)){ + if(type_entry->id == ZigTypeIdOpaque){ + add_node_error(g, param_node->data.param_decl.type, + buf_sprintf("parameter of opaque type '%s' not allowed", buf_ptr(&type_entry->name))); + } else { add_node_error(g, param_node->data.param_decl.type, buf_sprintf("parameter of type '%s' not allowed", buf_ptr(&type_entry->name))); - return g->builtin_types.entry_invalid; - case ZigTypeIdComptimeFloat: - case ZigTypeIdComptimeInt: - case ZigTypeIdEnumLiteral: - case ZigTypeIdBoundFn: - case ZigTypeIdMetaType: - case ZigTypeIdVoid: - case ZigTypeIdBool: - case ZigTypeIdInt: - case ZigTypeIdFloat: - case ZigTypeIdPointer: - case ZigTypeIdArray: - case ZigTypeIdStruct: - case ZigTypeIdOptional: - case ZigTypeIdErrorUnion: - case ZigTypeIdErrorSet: - case ZigTypeIdEnum: - case ZigTypeIdUnion: - case ZigTypeIdFn: - case ZigTypeIdVector: - case ZigTypeIdFnFrame: - case ZigTypeIdAnyFrame: - switch (type_requires_comptime(g, type_entry)) { - case ReqCompTimeNo: - break; - case ReqCompTimeYes: - add_node_error(g, param_node->data.param_decl.type, - buf_sprintf("parameter of type '%s' must be declared comptime", - buf_ptr(&type_entry->name))); - return g->builtin_types.entry_invalid; - case ReqCompTimeInvalid: - return g->builtin_types.entry_invalid; - } + } + + return g->builtin_types.entry_invalid; + } + + switch (type_requires_comptime(g, type_entry)) { + case ReqCompTimeNo: break; + case ReqCompTimeYes: + add_node_error(g, param_node->data.param_decl.type, + buf_sprintf("parameter of type '%s' must be declared comptime", + buf_ptr(&type_entry->name))); + return g->builtin_types.entry_invalid; + case ReqCompTimeInvalid: + return g->builtin_types.entry_invalid; } + FnTypeParamInfo *param_info = &fn_type_id.param_info[fn_type_id.next_param_index]; param_info->type = type_entry; param_info->is_noalias = param_node->data.param_decl.is_noalias; @@ -2001,43 +1981,12 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc } } - switch (fn_type_id.return_type->id) { - case ZigTypeIdInvalid: - case ZigTypeIdUndefined: - case ZigTypeIdNull: - case ZigTypeIdOpaque: - zig_unreachable(); - - case ZigTypeIdComptimeFloat: - case ZigTypeIdComptimeInt: - case ZigTypeIdEnumLiteral: - case ZigTypeIdBoundFn: - case ZigTypeIdMetaType: - case ZigTypeIdUnreachable: - case ZigTypeIdVoid: - case ZigTypeIdBool: - case ZigTypeIdInt: - case ZigTypeIdFloat: - case ZigTypeIdPointer: - case ZigTypeIdArray: - case ZigTypeIdStruct: - case ZigTypeIdOptional: - case ZigTypeIdErrorUnion: - case ZigTypeIdErrorSet: - case ZigTypeIdEnum: - case ZigTypeIdUnion: - case ZigTypeIdFn: - case ZigTypeIdVector: - case ZigTypeIdFnFrame: - case ZigTypeIdAnyFrame: - switch (type_requires_comptime(g, fn_type_id.return_type)) { - case ReqCompTimeInvalid: - return g->builtin_types.entry_invalid; - case ReqCompTimeYes: - return get_generic_fn_type(g, &fn_type_id); - case ReqCompTimeNo: - break; - } + switch (type_requires_comptime(g, fn_type_id.return_type)) { + case ReqCompTimeInvalid: + return g->builtin_types.entry_invalid; + case ReqCompTimeYes: + return get_generic_fn_type(g, &fn_type_id); + case ReqCompTimeNo: break; } @@ -2057,6 +2006,20 @@ bool is_valid_return_type(ZigType* type) { zig_unreachable(); } +bool is_valid_param_type(ZigType* type) { + switch (type->id) { + case ZigTypeIdInvalid: + case ZigTypeIdUndefined: + case ZigTypeIdNull: + case ZigTypeIdOpaque: + case ZigTypeIdUnreachable: + return false; + default: + return true; + } + zig_unreachable(); +} + bool type_is_invalid(ZigType *type_entry) { switch (type_entry->id) { case ZigTypeIdInvalid: |
