diff options
| author | gingerBill <bill@gingerbill.org> | 2017-11-12 17:55:16 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2017-11-12 17:55:16 +0000 |
| commit | 5ce65557219d57d19e9e45c5670b48bb40e22c3f (patch) | |
| tree | f789ae3e6bda92e589311042a8a7ab902a03d2f6 /src/check_expr.cpp | |
| parent | 53b3ad186f6c3ba27f308466f44de89ea1e91638 (diff) | |
Allow for default arguments after a variadic parameter
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 5e24c575e..a19522746 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4156,6 +4156,22 @@ CALL_ARGUMENT_CHECKER(check_call_arguments_internal) { param_count = param_tuple->variables.count; if (variadic) { + for (isize i = param_count-1; i >= 0; i--) { + Entity *e = param_tuple->variables[i]; + if (e->kind == Entity_TypeName) { + break; + } + + if (e->kind == Entity_Variable) { + if (e->Variable.default_value.kind != ExactValue_Invalid || + e->Variable.default_is_nil || + e->Variable.default_is_location) { + param_count--; + continue; + } + } + break; + } param_count--; } } @@ -4262,9 +4278,8 @@ CALL_ARGUMENT_CHECKER(check_call_arguments_internal) { continue; } - if (variadic) { - o = operands[operand_index]; - } + + i64 s = 0; if (!check_is_assignable_to_with_score(c, &o, t, &s)) { if (show_error) { |