aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-05-17 12:48:56 -0400
committerGitHub <noreply@github.com>2020-05-17 12:48:56 -0400
commit9a22c8b6ca98fd01795f8cd4f3e9d92311175f13 (patch)
treed580bf0cd72ee38b1b2d9aa0d6255d0de9b4369e /src/analyze.cpp
parent03ed9e4173131ac5e6157be500e3c50f7e0b0947 (diff)
parent887bf8ba93a9d060e08e3792afd6b5b9dabd9ccf (diff)
downloadzig-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.cpp117
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: