aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-05-25 13:48:10 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-05-25 13:48:10 -0400
commitfcdd808c5c1b866c2582a17839a53ce7bbbb78d6 (patch)
tree5c8d30ee489a33022ff28d5916d437dd02b5c960 /src/analyze.cpp
parent68add5d8286e5c517143b16a457a86a6c23dbc64 (diff)
downloadzig-fcdd808c5c1b866c2582a17839a53ce7bbbb78d6.tar.gz
zig-fcdd808c5c1b866c2582a17839a53ce7bbbb78d6.zip
fix segfault with array of variadic functions
closes #377
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 2f586f3a3e..fbf2eab9c8 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -987,7 +987,7 @@ TypeTableEntry *analyze_type_expr(CodeGen *g, Scope *scope, AstNode *node) {
return result->value.data.x_type;
}
-static TypeTableEntry *get_generic_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
+TypeTableEntry *get_generic_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
TypeTableEntry *fn_type = new_type_table_entry(TypeTableEntryIdFn);
fn_type->is_copyable = false;
buf_init_from_str(&fn_type->name, "fn(");
@@ -2504,7 +2504,11 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry *
if (expected_type->data.fn.fn_type_id.is_cold != actual_type->data.fn.fn_type_id.is_cold) {
return false;
}
- if (actual_type->data.fn.fn_type_id.return_type->id != TypeTableEntryIdUnreachable &&
+ 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 &&
+ 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,
actual_type->data.fn.fn_type_id.return_type))
@@ -2515,6 +2519,11 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry *
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;
+ }
// 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];