diff options
| author | gingerBill <bill@gingerbill.org> | 2024-04-04 16:57:08 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2024-04-04 16:57:08 +0100 |
| commit | 2375ac22a7535981b5177c09ca16f36f42fc2cda (patch) | |
| tree | 85107f0f9b3334d0eb4e016dbf1965742b1e90a4 /src | |
| parent | b979fd4c439f8b9eb30d800dec92a0a669617981 (diff) | |
Improve error messages for `A variable declaration must be an identifier`
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_stmt.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 883a6d213..a543ed9b0 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -740,6 +740,25 @@ gb_internal bool check_using_stmt_entity(CheckerContext *ctx, AstUsingStmt *us, return true; } +gb_internal void error_var_decl_identifier(Ast *name) { + GB_ASSERT(name != nullptr); + GB_ASSERT(name->kind != Ast_Ident); + + ERROR_BLOCK(); + gbString s = expr_to_string(name); + defer (gb_string_free(s)); + + error(name, "A variable declaration must be an identifier, got '%s'", s); + if (name->kind == Ast_Implicit) { + String imp = name->Implicit.string; + if (imp == "context") { + error_line("\tSuggestion: '%.*s' is a reserved keyword, would 'ctx' suffice?\n", LIT(imp)); + } else { + error_line("\tNote: '%.*s' is a reserved keyword\n", LIT(imp)); + } + } +} + gb_internal void check_inline_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { ast_node(irs, UnrollRangeStmt, node); check_open_scope(ctx, node); @@ -851,7 +870,7 @@ gb_internal void check_inline_range_stmt(CheckerContext *ctx, Ast *node, u32 mod entity = found; } } else { - error(name, "A variable declaration must be an identifier"); + error_var_decl_identifier(name); } if (entity == nullptr) { @@ -1747,9 +1766,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) entity = found; } } else { - gbString s = expr_to_string(lhs[i]); - error(name, "A variable declaration must be an identifier, got %s", s); - gb_string_free(s); + error_var_decl_identifier(name); } if (entity == nullptr) { @@ -1801,7 +1818,7 @@ gb_internal void check_value_decl_stmt(CheckerContext *ctx, Ast *node, u32 mod_f for (Ast *name : vd->names) { Entity *entity = nullptr; if (name->kind != Ast_Ident) { - error(name, "A variable declaration must be an identifier"); + error_var_decl_identifier(name); } else { Token token = name->Ident.token; String str = token.string; |