diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-05-25 13:48:10 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-05-25 13:48:10 -0400 |
| commit | fcdd808c5c1b866c2582a17839a53ce7bbbb78d6 (patch) | |
| tree | 5c8d30ee489a33022ff28d5916d437dd02b5c960 /src/analyze.cpp | |
| parent | 68add5d8286e5c517143b16a457a86a6c23dbc64 (diff) | |
| download | zig-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.cpp | 13 |
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]; |
