From 88326ab0afdfeb86be3096ec76392a1ad663421c Mon Sep 17 00:00:00 2001 From: Rua Date: Wed, 15 Apr 2026 15:01:47 +0200 Subject: [PATCH 1/2] transpile: Do not require `expr` for `convert_cast_to_enum` --- c2rust-transpile/src/translator/mod.rs | 10 +--------- c2rust-transpile/src/translator/pointers.rs | 3 +-- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/c2rust-transpile/src/translator/mod.rs b/c2rust-transpile/src/translator/mod.rs index e986c89aeb..343286b34f 100644 --- a/c2rust-transpile/src/translator/mod.rs +++ b/c2rust-transpile/src/translator/mod.rs @@ -4228,16 +4228,8 @@ impl<'c> Translation<'c> { self.f128_cast_to(val, target_ty_kind) } else if let &CTypeKind::Enum(enum_decl_id) = target_ty_kind { // Casts targeting `enum` types... - let expr = - expr.ok_or_else(|| format_err!("Casts to enums require a C ExprId"))?; val.result_map(|val| { - self.convert_cast_to_enum( - ctx, - target_cty.ctype, - enum_decl_id, - Some(expr), - val, - ) + self.convert_cast_to_enum(ctx, target_cty.ctype, enum_decl_id, expr, val) }) } else if target_ty_kind.is_floating_type() && source_ty_kind.is_bool() { Ok(val.map(|val| { diff --git a/c2rust-transpile/src/translator/pointers.rs b/c2rust-transpile/src/translator/pointers.rs index cd678edafa..eb58f47a52 100644 --- a/c2rust-transpile/src/translator/pointers.rs +++ b/c2rust-transpile/src/translator/pointers.rs @@ -547,9 +547,8 @@ impl<'c> Translation<'c> { ))) }) } else if let &CTypeKind::Enum(enum_decl_id) = target_ty_kind { - let expr = expr.ok_or_else(|| format_err!("Casts to enums require a C ExprId"))?; val.result_map(|val| { - self.convert_cast_to_enum(ctx, target_cty, enum_decl_id, Some(expr), val) + self.convert_cast_to_enum(ctx, target_cty, enum_decl_id, expr, val) }) } else { Ok(val.map(|val| mk().cast_expr(val, target_ty))) From eeece581dfb7305f7db029a3cbc248226744a1c5 Mon Sep 17 00:00:00 2001 From: Rua Date: Wed, 15 Apr 2026 15:02:03 +0200 Subject: [PATCH 2/2] transpile: Include enums in `CastKind::from_types` --- c2rust-transpile/src/c_ast/mod.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/c2rust-transpile/src/c_ast/mod.rs b/c2rust-transpile/src/c_ast/mod.rs index b83171902c..7f06c74aab 100644 --- a/c2rust-transpile/src/c_ast/mod.rs +++ b/c2rust-transpile/src/c_ast/mod.rs @@ -1803,17 +1803,17 @@ impl CastKind { (CTypeKind::Function(..), CTypeKind::Pointer(..)) => CastKind::FunctionToPointerDecay, - (_, CTypeKind::Pointer(..)) if source_ty_kind.is_integral_type() => { + (_, CTypeKind::Pointer(..)) if source_ty_kind.is_enum_or_integral_type() => { CastKind::IntegralToPointer } (CTypeKind::Pointer(..), CTypeKind::Bool) => CastKind::PointerToBoolean, - (CTypeKind::Pointer(..), _) if target_ty_kind.is_integral_type() => { + (CTypeKind::Pointer(..), _) if target_ty_kind.is_enum_or_integral_type() => { CastKind::PointerToIntegral } - (_, CTypeKind::Bool) if source_ty_kind.is_integral_type() => { + (_, CTypeKind::Bool) if source_ty_kind.is_enum_or_integral_type() => { CastKind::IntegralToBoolean } @@ -1821,11 +1821,17 @@ impl CastKind { CastKind::BooleanToSignedIntegral } - (_, _) if source_ty_kind.is_integral_type() && target_ty_kind.is_integral_type() => { + (_, _) + if source_ty_kind.is_enum_or_integral_type() + && target_ty_kind.is_enum_or_integral_type() => + { CastKind::IntegralCast } - (_, _) if source_ty_kind.is_integral_type() && target_ty_kind.is_floating_type() => { + (_, _) + if source_ty_kind.is_enum_or_integral_type() + && target_ty_kind.is_floating_type() => + { CastKind::IntegralToFloating } @@ -1833,7 +1839,10 @@ impl CastKind { CastKind::FloatingToBoolean } - (_, _) if source_ty_kind.is_floating_type() && target_ty_kind.is_integral_type() => { + (_, _) + if source_ty_kind.is_floating_type() + && target_ty_kind.is_enum_or_integral_type() => + { CastKind::FloatingToIntegral } @@ -2684,6 +2693,10 @@ impl CTypeKind { matches!(*self, Self::Enum { .. }) } + pub fn is_enum_or_integral_type(&self) -> bool { + self.is_integral_type() || self.is_enum() + } + pub fn is_integral_type(&self) -> bool { self.is_unsigned_integral_type() || self.is_signed_integral_type() }