mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-30 09:54:45 +00:00
Add range-based error messages to -verbose-errors
Example: Cannot convert '(1 + 2)' to 'untyped bool' from 'untyped integer' x := (1 + 2) * true; ^~~~~~^
This commit is contained in:
@@ -5516,7 +5516,7 @@ ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call, Ast *pr
|
||||
if (proc != nullptr &&
|
||||
proc->kind == Ast_BasicDirective) {
|
||||
ast_node(bd, BasicDirective, proc);
|
||||
String name = bd->name;
|
||||
String name = bd->name.string;
|
||||
if (name == "location" || name == "assert" || name == "panic" || name == "defined" || name == "config" || name == "load") {
|
||||
operand->mode = Addressing_Builtin;
|
||||
operand->builtin_id = BuiltinProc_DIRECTIVE;
|
||||
@@ -6191,13 +6191,14 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
||||
|
||||
case_ast_node(bd, BasicDirective, node);
|
||||
o->mode = Addressing_Constant;
|
||||
if (bd->name == "file") {
|
||||
String name = bd->name.string;
|
||||
if (name == "file") {
|
||||
o->type = t_untyped_string;
|
||||
o->value = exact_value_string(get_file_path_string(bd->token.pos.file_id));
|
||||
} else if (bd->name == "line") {
|
||||
} else if (name == "line") {
|
||||
o->type = t_untyped_integer;
|
||||
o->value = exact_value_i64(bd->token.pos.line);
|
||||
} else if (bd->name == "procedure") {
|
||||
} else if (name == "procedure") {
|
||||
if (c->curr_proc_decl == nullptr) {
|
||||
error(node, "#procedure may only be used within procedures");
|
||||
o->type = t_untyped_string;
|
||||
@@ -6206,7 +6207,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
||||
o->type = t_untyped_string;
|
||||
o->value = exact_value_string(c->proc_name);
|
||||
}
|
||||
} else if (bd->name == "caller_location") {
|
||||
} else if (name == "caller_location") {
|
||||
init_core_source_code_location(c->checker);
|
||||
error(node, "#caller_location may only be used as a default argument parameter");
|
||||
o->type = t_source_code_location;
|
||||
@@ -6373,7 +6374,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
||||
if (cl->type->ArrayType.tag != nullptr) {
|
||||
Ast *tag = cl->type->ArrayType.tag;
|
||||
GB_ASSERT(tag->kind == Ast_BasicDirective);
|
||||
String name = tag->BasicDirective.name;
|
||||
String name = tag->BasicDirective.name.string;
|
||||
if (name == "soa") {
|
||||
error(node, "#soa arrays are not supported for compound literals");
|
||||
return kind;
|
||||
@@ -6385,7 +6386,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
|
||||
if (cl->elems.count > 0) {
|
||||
Ast *tag = cl->type->DynamicArrayType.tag;
|
||||
GB_ASSERT(tag->kind == Ast_BasicDirective);
|
||||
String name = tag->BasicDirective.name;
|
||||
String name = tag->BasicDirective.name.string;
|
||||
if (name == "soa") {
|
||||
error(node, "#soa arrays are not supported for compound literals");
|
||||
return kind;
|
||||
@@ -8151,7 +8152,7 @@ gbString write_expr_to_string(gbString str, Ast *node, bool shorthand) {
|
||||
|
||||
case_ast_node(bd, BasicDirective, node);
|
||||
str = gb_string_append_rune(str, '#');
|
||||
str = string_append_string(str, bd->name);
|
||||
str = string_append_string(str, bd->name.string);
|
||||
case_end;
|
||||
|
||||
case_ast_node(ud, Undef, node);
|
||||
|
||||
Reference in New Issue
Block a user