From e46d772b6d01d06d7186438cadb61a0a30f17371 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 29 Jun 2024 12:13:41 +0100 Subject: [PATCH] Add check for integer casts --- src/check_expr.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 45500e79a..6b11a9d08 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3505,17 +3505,24 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type if (c->pkg && (c->pkg->kind == Package_Runtime || c->pkg->kind == Package_Builtin)) { is_runtime = true; } - if (are_types_identical(src_t, dst_t) && !is_runtime) { - gbString oper_str = expr_to_string(o->expr); - gbString to_type = type_to_string(dst_t); - error(o->expr, "Unneeded transmute of '%s' to identical type '%s'", oper_str, to_type); - gb_string_free(oper_str); - gb_string_free(to_type); + if (are_types_identical(src_t, dst_t)) { + if (!is_runtime) { + gbString oper_str = expr_to_string(o->expr); + gbString to_type = type_to_string(dst_t); + error(o->expr, "Unneeded transmute of '%s' to identical type '%s'", oper_str, to_type); + gb_string_free(oper_str); + gb_string_free(to_type); + } } else if (is_type_internally_pointer_like(src_t) && is_type_internally_pointer_like(dst_t)) { - gbString to_type = type_to_string(dst_t); - error(o->expr, "Use of 'transmute' where 'cast' would be preferred since the types are pointer-like", to_type); + error(o->expr, "Use of 'transmute' where 'cast' would be preferred since the types are pointer-like"); + } else if (is_type_integer(src_t) && is_type_integer(dst_t) && + types_have_same_internal_endian(src_t, dst_t)) { + gbString oper_type = type_to_string(src_t); + gbString to_type = type_to_string(dst_t); + error(o->expr, "Use of 'transmute' where 'cast' would be preferred since both are integers of the same endianness, from '%s' to '%s'", oper_type, to_type); gb_string_free(to_type); + gb_string_free(oper_type); } } }