aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2017-11-12 17:55:16 +0000
committergingerBill <bill@gingerbill.org>2017-11-12 17:55:16 +0000
commit5ce65557219d57d19e9e45c5670b48bb40e22c3f (patch)
treef789ae3e6bda92e589311042a8a7ab902a03d2f6 /src/check_expr.cpp
parent53b3ad186f6c3ba27f308466f44de89ea1e91638 (diff)
Allow for default arguments after a variadic parameter
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp21
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) {