diff options
| author | Daniel Gavin <danielgavin5@hotmail.com> | 2021-04-23 10:24:05 +0200 |
|---|---|---|
| committer | Daniel Gavin <danielgavin5@hotmail.com> | 2021-04-23 10:24:05 +0200 |
| commit | f10f7ebbf1c9833c74d09db68c0a0f5a149bde8d (patch) | |
| tree | d25d97bafc0f762e537428f99607680aa5e434b3 /src/check_stmt.cpp | |
| parent | 40ed7e48d0e4a1f000efbd03d19a4eebe9b8e2f6 (diff) | |
| parent | 17bbb48d8a04aaf6cc53777fe4da6ba1b7fff61b (diff) | |
Merge remote-tracking branch 'upstream/master' into prototype-fmt
Diffstat (limited to 'src/check_stmt.cpp')
| -rw-r--r-- | src/check_stmt.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 9d02d003d..7d9eefe19 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -10,7 +10,19 @@ bool is_diverging_stmt(Ast *stmt) { String name = expr->CallExpr.proc->BasicDirective.name; return name == "panic"; } - Type *t = type_of_expr(expr->CallExpr.proc); + Ast *proc = unparen_expr(expr->CallExpr.proc); + TypeAndValue tv = proc->tav; + if (tv.mode == Addressing_Builtin) { + Entity *e = entity_of_node(proc); + BuiltinProcId id = BuiltinProc_Invalid; + if (e != nullptr) { + id = cast(BuiltinProcId)e->Builtin.id; + } else { + id = BuiltinProc_DIRECTIVE; + } + return builtin_procs[id].diverging; + } + Type *t = tv.type; t = base_type(t); return t != nullptr && t->kind == Type_Proc && t->Proc.diverging; } @@ -1751,7 +1763,7 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) { Type *cond_type = t->Tuple.variables[count-1]->type; if (!is_type_boolean(cond_type)) { gbString s = type_to_string(cond_type); - error(operand.expr, "The final type of %td-valued tuple must be a boolean, got %s", count, s); + error(operand.expr, "The final type of %td-valued expression must be a boolean, got %s", count, s); gb_string_free(s); break; } @@ -1762,14 +1774,14 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) { if (rs->vals.count > 1 && rs->vals[1] != nullptr && count < 3) { gbString s = type_to_string(t); - error(operand.expr, "Expected a 3-value tuple on the rhs, got (%s)", s); + error(operand.expr, "Expected a 3-valued expression on the rhs, got (%s)", s); gb_string_free(s); break; } if (rs->vals.count > 0 && rs->vals[0] != nullptr && count < 2) { gbString s = type_to_string(t); - error(operand.expr, "Expected at least a 2-values tuple on the rhs, got (%s)", s); + error(operand.expr, "Expected at least a 2-valued expression on the rhs, got (%s)", s); gb_string_free(s); break; } |