diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-09-07 19:23:00 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-09-07 19:23:00 +0100 |
| commit | 7ba13a18a33d8f852eb41b58da662ddb4649d04f (patch) | |
| tree | 89663aff3ad0c5e5f62a3432d269dcee050a71ed /src/checker/expr.cpp | |
| parent | 2c4193a24226b084797af61e29c8355835c179a8 (diff) | |
Basic variadic `print` procedure
Diffstat (limited to 'src/checker/expr.cpp')
| -rw-r--r-- | src/checker/expr.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/checker/expr.cpp b/src/checker/expr.cpp index e55efd56d..b5fb1249f 100644 --- a/src/checker/expr.cpp +++ b/src/checker/expr.cpp @@ -2714,6 +2714,8 @@ void check_call_arguments(Checker *c, Operand *operand, Type *proc_type, AstNode GB_ASSERT(call->kind == AstNode_CallExpr); GB_ASSERT(proc_type->kind == Type_Proc); ast_node(ce, CallExpr, call); + + isize error_code = 0; isize param_index = 0; isize param_count = 0; @@ -2723,6 +2725,15 @@ void check_call_arguments(Checker *c, Operand *operand, Type *proc_type, AstNode param_count = proc_type->Proc.params->Tuple.variable_count; } + if (ce->ellipsis.pos.line != 0) { + if (!variadic) { + error(&c->error_collector, ce->ellipsis, + "Cannot use `..` in call to a non-variadic procedure: `%.*s`", + LIT(ce->proc->Ident.string)); + return; + } + } + if (ce->arg_list_count == 0) { if (variadic && param_count-1 == 0) return; @@ -2730,6 +2741,8 @@ void check_call_arguments(Checker *c, Operand *operand, Type *proc_type, AstNode return; } + + if (ce->arg_list_count > param_count && !variadic) { error_code = +1; } else { |