diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-05-26 14:39:18 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-05-26 14:39:18 -0400 |
| commit | c42c91ee7c630d47e6adc0a940b5f10bbe04d13a (patch) | |
| tree | e953816629530d2d532c097cbac3bb846e51763f /src/analyze.cpp | |
| parent | fcdd808c5c1b866c2582a17839a53ce7bbbb78d6 (diff) | |
| download | zig-c42c91ee7c630d47e6adc0a940b5f10bbe04d13a.tar.gz zig-c42c91ee7c630d47e6adc0a940b5f10bbe04d13a.zip | |
fix segfault with array of generic functions
closes #377
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index fbf2eab9c8..952f5468b3 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -1033,10 +1033,10 @@ static TypeTableEntry *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *c AstNode *param_node = fn_proto->params.at(fn_type_id.next_param_index); assert(param_node->type == NodeTypeParamDecl); - bool param_is_inline = param_node->data.param_decl.is_inline; + bool param_is_comptime = param_node->data.param_decl.is_inline; bool param_is_var_args = param_node->data.param_decl.is_var_args; - if (param_is_inline) { + if (param_is_comptime) { if (fn_type_id.is_extern) { add_node_error(g, param_node, buf_sprintf("comptime parameter not allowed in extern function")); @@ -2507,7 +2507,10 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry * if (expected_type->data.fn.fn_type_id.is_var_args != actual_type->data.fn.fn_type_id.is_var_args) { return false; } - if (!expected_type->data.fn.fn_type_id.is_var_args && + if (expected_type->data.fn.is_generic != actual_type->data.fn.is_generic) { + return false; + } + if (!expected_type->data.fn.is_generic && actual_type->data.fn.fn_type_id.return_type->id != TypeTableEntryIdUnreachable && !types_match_const_cast_only( expected_type->data.fn.fn_type_id.return_type, @@ -2518,12 +2521,12 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry * if (expected_type->data.fn.fn_type_id.param_count != actual_type->data.fn.fn_type_id.param_count) { return false; } - for (size_t i = 0; i < expected_type->data.fn.fn_type_id.param_count; i += 1) { - if (i == expected_type->data.fn.fn_type_id.param_count - 1 && - expected_type->data.fn.fn_type_id.is_var_args) - { - continue; - } + if (expected_type->data.fn.fn_type_id.next_param_index != actual_type->data.fn.fn_type_id.next_param_index) { + return false; + } + assert(expected_type->data.fn.is_generic || + expected_type->data.fn.fn_type_id.next_param_index == expected_type->data.fn.fn_type_id.param_count); + for (size_t i = 0; i < expected_type->data.fn.fn_type_id.next_param_index; i += 1) { // note it's reversed for parameters FnTypeParamInfo *actual_param_info = &actual_type->data.fn.fn_type_id.param_info[i]; FnTypeParamInfo *expected_param_info = &expected_type->data.fn.fn_type_id.param_info[i]; |
