aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-11-21 19:18:17 +0100
committerLaytan Laats <laytanlaats@hotmail.com>2024-11-21 19:18:17 +0100
commit83bf0c6ab82ed035f3ba133de3411f6e01c1f8d4 (patch)
tree435b53641531a05f3c5f44c2bb824044346fe042 /src/check_expr.cpp
parenta88ac1d21078d3b786a6ba6ed39daba013d57ff4 (diff)
checker: only error with -vet-cast when it is actually castable
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index cb4647f33..53d407b51 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3541,6 +3541,8 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type
return false;
}
+ Operand src = *o;
+
Type *src_t = o->type;
Type *dst_t = t;
Type *src_bt = base_type(src_t);
@@ -3629,7 +3631,8 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type
// identical casts that cannot be foreseen or otherwise
// 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))) {
+ (c->curr_proc_sig == nullptr || !is_type_polymorphic(c->curr_proc_sig)) &&
+ check_is_castable_to(c, &src, dst_t)) {
if (are_types_identical(src_t, dst_t)) {
gbString oper_str = expr_to_string(o->expr);
gbString to_type = type_to_string(dst_t);