diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_builtin.cpp | 20 | ||||
| -rw-r--r-- | src/parser.cpp | 2 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 47abd42cf..e85981911 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1714,6 +1714,26 @@ gb_internal bool check_builtin_procedure_directive(CheckerContext *c, Operand *o operand->type = t_untyped_bool; operand->mode = Addressing_Constant; + } else if (name == "warning") { + ERROR_BLOCK(); + if (ce->args.count != 1) { + error(call, "'#warning' expects 1 argument, got %td", ce->args.count); + return false; + } + if (!is_type_string(operand->type) && operand->mode != Addressing_Constant) { + gbString str = expr_to_string(ce->args[0]); + error(call, "'%s' is not a constant string", str); + gb_string_free(str); + return false; + } + warning(call, "%.*s", LIT(operand->value.value_string)); + if (c->proc_name != "") { + gbString str = type_to_string(c->curr_proc_sig); + error_line("\tCalled within '%.*s' :: %s\n", LIT(c->proc_name), str); + gb_string_free(str); + } + operand->type = t_invalid; + operand->mode = Addressing_NoValue; } else if (name == "panic") { ERROR_BLOCK(); if (ce->args.count != 1) { diff --git a/src/parser.cpp b/src/parser.cpp index 0cd96f5b5..7383c3360 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5167,7 +5167,7 @@ gb_internal Ast *parse_stmt(AstFile *f) { break; } return s; - } else if (tag == "assert" || tag == "panic") { + } else if (tag == "assert" || tag == "panic" || tag == "warning") { Ast *t = ast_basic_directive(f, hash_token, name); Ast *stmt = ast_expr_stmt(f, parse_call_expr(f, t)); expect_semicolon(f); |