aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-05-26 14:39:18 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-05-26 14:39:18 -0400
commitc42c91ee7c630d47e6adc0a940b5f10bbe04d13a (patch)
treee953816629530d2d532c097cbac3bb846e51763f /src/analyze.cpp
parentfcdd808c5c1b866c2582a17839a53ce7bbbb78d6 (diff)
downloadzig-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.cpp21
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];