aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-08-20 22:12:47 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2024-08-20 22:13:31 +0200
commit6b4b0cea5dd0b451a283f919e36fa6c060f2f236 (patch)
tree159bf5962d98f001987daf260c261b3b3d92d590 /src/check_expr.cpp
parent85a33a1c9b5a238a8fea59b746d067bdfa809a62 (diff)
Add table-driven (in)definite article to some errors.
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index f4d5cc5a4..2540230df 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -1071,16 +1071,19 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
return;
}
+ // Grab definite or indefinite article matching `context_name`, or "" if not found.
+ String article = error_article(context_name);
+
if (is_type_untyped(operand->type)) {
Type *target_type = type;
if (type == nullptr || is_type_any(type)) {
if (type == nullptr && is_type_untyped_uninit(operand->type)) {
- error(operand->expr, "Use of --- in %.*s", LIT(context_name));
+ error(operand->expr, "Use of --- in %.*s%.*s", LIT(article), LIT(context_name));
operand->mode = Addressing_Invalid;
return;
}
if (type == nullptr && is_type_untyped_nil(operand->type)) {
- error(operand->expr, "Use of untyped nil in %.*s", LIT(context_name));
+ error(operand->expr, "Use of untyped nil in %.*s%.*s", LIT(article), LIT(context_name));
operand->mode = Addressing_Invalid;
return;
}
@@ -1135,9 +1138,10 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
// TODO(bill): is this a good enough error message?
error(operand->expr,
- "Cannot assign overloaded procedure group '%s' to '%s' in %.*s",
+ "Cannot assign overloaded procedure group '%s' to '%s' in %.*s%.*s",
expr_str,
op_type_str,
+ LIT(article),
LIT(context_name));
operand->mode = Addressing_Invalid;
}
@@ -1163,20 +1167,23 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
switch (operand->mode) {
case Addressing_Builtin:
error(operand->expr,
- "Cannot assign built-in procedure '%s' in %.*s",
+ "Cannot assign built-in procedure '%s' to %.*s%.*s",
expr_str,
+ LIT(article),
LIT(context_name));
break;
case Addressing_Type:
if (is_type_polymorphic(operand->type)) {
error(operand->expr,
- "Cannot assign '%s' which is a polymorphic type in %.*s",
+ "Cannot assign '%s' — a polymorphic type — to %.*s%.*s",
op_type_str,
+ LIT(article),
LIT(context_name));
} else {
error(operand->expr,
- "Cannot assign '%s' which is a type in %.*s",
+ "Cannot assign '%s' — a type — to %.*s%.*s",
op_type_str,
+ LIT(article),
LIT(context_name));
}
break;
@@ -1203,10 +1210,11 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
ERROR_BLOCK();
error(operand->expr,
- "Cannot assign value '%s' of type '%s%s' to '%s%s' in %.*s",
+ "Cannot assign value '%s' of type '%s%s' to '%s%s' in %.*s%.*s",
expr_str,
op_type_str, op_type_extra,
type_str, type_extra,
+ LIT(article),
LIT(context_name));
check_assignment_error_suggestion(c, operand, type);