|
@@ -1060,6 +1060,8 @@ void check_assignment(CheckerContext *c, Operand *operand, Type *type, String co
|
|
|
type_extra = gb_string_append_fmt(type_extra, " (package %.*s)", LIT(type_pkg->name));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ ERROR_BLOCK();
|
|
|
error(operand->expr,
|
|
|
"Cannot assign value '%s' of type '%s%s' to '%s%s' in %.*s",
|
|
|
expr_str,
|
|
@@ -1983,10 +1985,18 @@ void check_assignment_error_suggestion(CheckerContext *c, Operand *o, Type *type
|
|
|
if (are_types_identical(s, d)) {
|
|
|
error_line("\tSuggestion: the array expression may be sliced with %s[:]\n", a);
|
|
|
}
|
|
|
- } else if (are_types_identical(src, dst)) {
|
|
|
+ } else if (is_type_dynamic_array(src) && is_type_slice(dst)) {
|
|
|
+ Type *s = src->DynamicArray.elem;
|
|
|
+ Type *d = dst->Slice.elem;
|
|
|
+ if (are_types_identical(s, d)) {
|
|
|
+ error_line("\tSuggestion: the dynamic array expression may be sliced with %s[:]\n", a);
|
|
|
+ }
|
|
|
+ }else if (are_types_identical(src, dst) && !are_types_identical(o->type, type)) {
|
|
|
error_line("\tSuggestion: the expression may be directly casted to type %s\n", b);
|
|
|
} else if (are_types_identical(src, t_string) && is_type_u8_slice(dst)) {
|
|
|
error_line("\tSuggestion: a string may be transmuted to %s\n", b);
|
|
|
+ error_line("\t This is an UNSAFE operation as string data is assumed to be immutable, \n");
|
|
|
+ error_line("\t whereas slices in general are assumed to be mutable.\n");
|
|
|
} else if (is_type_u8_slice(src) && are_types_identical(dst, t_string)) {
|
|
|
error_line("\tSuggestion: the expression may be casted to %s\n", b);
|
|
|
}
|
|
@@ -2059,10 +2069,12 @@ bool check_is_expressible(CheckerContext *ctx, Operand *o, Type *type) {
|
|
|
if (!is_type_integer(o->type) && is_type_integer(type)) {
|
|
|
error(o->expr, "'%s' truncated to '%s', got %s", a, b, s);
|
|
|
} else {
|
|
|
+ ERROR_BLOCK();
|
|
|
error(o->expr, "Cannot convert numeric value '%s' to '%s' from '%s', got %s", a, b, c, s);
|
|
|
check_assignment_error_suggestion(ctx, o, type);
|
|
|
}
|
|
|
} else {
|
|
|
+ ERROR_BLOCK();
|
|
|
error(o->expr, "Cannot convert '%s' to '%s' from '%s', got %s", a, b, c, s);
|
|
|
check_assignment_error_suggestion(ctx, o, type);
|
|
|
}
|