From c88a1bef91c56e8b2732077965381156032805d3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 29 Jun 2024 12:40:04 +0100 Subject: [PATCH] Add another `-vet-cast` check --- base/runtime/internal.odin | 1 + core/encoding/uuid/stamping.odin | 2 +- core/net/addr.odin | 7 +++---- core/net/socket_linux.odin | 4 ++-- src/check_expr.cpp | 22 +++++++++++----------- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index 203ee2873..1a97ade09 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -1,3 +1,4 @@ +//+vet !cast package runtime import "base:intrinsics" diff --git a/core/encoding/uuid/stamping.odin b/core/encoding/uuid/stamping.odin index 0c07725c3..3ca61fe44 100644 --- a/core/encoding/uuid/stamping.odin +++ b/core/encoding/uuid/stamping.odin @@ -41,7 +41,7 @@ Returns: - result: A valid version 8 UUID. */ stamp_v8_array :: proc(array: [16]u8) -> (result: Identifier) { - result = transmute(Identifier)array + result = Identifier(array) result[VERSION_BYTE_INDEX] &= 0x0F result[VERSION_BYTE_INDEX] |= 0x80 diff --git a/core/net/addr.odin b/core/net/addr.odin index c01724d99..eed3fb3b9 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -370,7 +370,7 @@ parse_ip6_address :: proc(address_and_maybe_port: string) -> (addr: IP6_Address, val |= u16(ipv4[3]) piece_values[7] = u16be(val) } - return transmute(IP6_Address)piece_values, true + return IP6_Address(piece_values), true } /* @@ -522,10 +522,9 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> run := Zero_Run{-1, -1} best := Zero_Run{-1, -1} - addr := transmute([8]u16be)v last := u16be(1) - for val, i in addr { + for val, i in v { /* If we encounter adjacent zeroes, then start a new run if not already in one. Also remember the rightmost index regardless, because it'll be the new @@ -559,7 +558,7 @@ address_to_string :: proc(addr: Address, allocator := context.temp_allocator) -> last = val } - for val, i in addr { + for val, i in v { if best.start == i || best.end == i { // For the left and right side of the best zero run, print a `:`. fmt.sbprint(&b, ":") diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin index a4d75b92b..dc960a5fb 100644 --- a/core/net/socket_linux.odin +++ b/core/net/socket_linux.odin @@ -80,14 +80,14 @@ _unwrap_os_addr :: proc "contextless" (endpoint: Endpoint)->(linux.Sock_Addr_Any ipv4 = { sin_family = .INET, sin_port = u16be(endpoint.port), - sin_addr = transmute([4]u8) endpoint.address.(IP4_Address), + sin_addr = ([4]u8)(endpoint.address.(IP4_Address)), }, } case IP6_Address: return { ipv6 = { sin6_port = u16be(endpoint.port), - sin6_addr = transmute([16]u8) endpoint.address.(IP6_Address), + sin6_addr = transmute([16]u8)endpoint.address.(IP6_Address), sin6_family = .INET6, }, } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 6b11a9d08..7107c5712 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3501,21 +3501,21 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type // forbidden, so just skip them. if (forbid_identical && check_vet_flags(c) & VetFlag_Cast && (c->curr_proc_sig == nullptr || !is_type_polymorphic(c->curr_proc_sig))) { - bool is_runtime = false; - if (c->pkg && (c->pkg->kind == Package_Runtime || c->pkg->kind == Package_Builtin)) { - is_runtime = true; - } 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); - } + 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)) { error(o->expr, "Use of 'transmute' where 'cast' would be preferred since the types are pointer-like"); + } else if (are_types_identical(src_bt, dst_bt)) { + 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_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);