From 67a7b737ec72d0dba3bc3b39167202c2b9915a0f Mon Sep 17 00:00:00 2001 From: Andrei Homescu Date: Sat, 27 Jun 2026 01:45:38 -0700 Subject: [PATCH 1/2] transpile: fix misclassified cast in array indexing --- c2rust-transpile/src/translator/pointers.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/c2rust-transpile/src/translator/pointers.rs b/c2rust-transpile/src/translator/pointers.rs index 9c890fb2ea..eecf6778b6 100644 --- a/c2rust-transpile/src/translator/pointers.rs +++ b/c2rust-transpile/src/translator/pointers.rs @@ -343,10 +343,18 @@ impl<'c> Translation<'c> { self.convert_pointer_offset(lhs, rhs, pointee_type_id.ctype, false, deref); if lrvalue.is_rvalue() { + let source_type_id = if deref { + pointee_type_id + } else { + let pointer_type_id = self + .ast_context + .type_for_kind(&CTypeKind::Pointer(pointee_type_id)); + CQualTypeId::new(pointer_type_id) + }; val = self.make_cast( ctx, - pointee_type_id, - override_ty.unwrap_or(pointee_type_id), + source_type_id, + override_ty.unwrap_or(source_type_id), val, )?; } From 1834662431c8f51b28f25387439ff982e4e4af83 Mon Sep 17 00:00:00 2001 From: Andrei Homescu Date: Sat, 27 Jun 2026 00:56:00 -0700 Subject: [PATCH 2/2] transpile: update snapshots after provenance changes --- .../snapshots__transpile@arrays.c.2021.clang15.snap | 5 ++--- .../snapshots__transpile@arrays.c.2024.clang15.snap | 5 ++--- .../snapshots__transpile@exprs.c.2021.clang15.snap | 3 +-- .../snapshots__transpile@exprs.c.2024.clang15.snap | 3 +-- .../snapshots__transpile@macros.c.2021.clang15.snap | 2 +- .../snapshots__transpile@macros.c.2024.clang15.snap | 2 +- ...apshots__transpile@vm_x86.c.2021.aarch64.clang15.snap | 9 ++++----- ...napshots__transpile@vm_x86.c.2021.x86_64.clang15.snap | 9 ++++----- ...apshots__transpile@vm_x86.c.2024.aarch64.clang15.snap | 9 ++++----- ...napshots__transpile@vm_x86.c.2024.x86_64.clang15.snap | 9 ++++----- 10 files changed, 24 insertions(+), 32 deletions(-) diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2021.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2021.clang15.snap index f19329d9a1..0ac2320123 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2021.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2021.clang15.snap @@ -101,9 +101,8 @@ pub unsafe extern "C" fn entry() { as *mut [::core::ffi::c_char; 4]; let mut past_end: *mut ::core::ffi::c_char = (&raw mut static_char_array as *mut ::core::ffi::c_char) - .offset(::core::mem::size_of::<[::core::ffi::c_char; 9]>() as isize) - as *mut ::core::ffi::c_char; - past_end = static_char_ptr.offset(8 as ::core::ffi::c_int as isize) as *mut ::core::ffi::c_char; + .offset(::core::mem::size_of::<[::core::ffi::c_char; 9]>() as isize); + past_end = static_char_ptr.offset(8 as ::core::ffi::c_int as isize); } #[no_mangle] pub unsafe extern "C" fn short_initializer() { diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2024.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2024.clang15.snap index 5e554585db..a484d78dcc 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2024.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@arrays.c.2024.clang15.snap @@ -101,9 +101,8 @@ pub unsafe extern "C" fn entry() { as *mut [::core::ffi::c_char; 4]; let mut past_end: *mut ::core::ffi::c_char = (&raw mut static_char_array as *mut ::core::ffi::c_char) - .offset(::core::mem::size_of::<[::core::ffi::c_char; 9]>() as isize) - as *mut ::core::ffi::c_char; - past_end = static_char_ptr.offset(8 as ::core::ffi::c_int as isize) as *mut ::core::ffi::c_char; + .offset(::core::mem::size_of::<[::core::ffi::c_char; 9]>() as isize); + past_end = static_char_ptr.offset(8 as ::core::ffi::c_int as isize); } #[unsafe(no_mangle)] pub unsafe extern "C" fn short_initializer() { diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2021.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2021.clang15.snap index 7a94c7caf6..b08ad85741 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2021.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2021.clang15.snap @@ -52,8 +52,7 @@ pub unsafe extern "C" fn unary_with_side_effect() { side_effect(); !side_effect(); (side_effect() == 0) as ::core::ffi::c_int; - (b"\0".as_ptr() as *const ::core::ffi::c_char).offset(side_effect() as isize) - as *const ::core::ffi::c_char; + (b"\0".as_ptr() as *const ::core::ffi::c_char).offset(side_effect() as isize); } #[no_mangle] pub unsafe extern "C" fn inc_decl_with_rvalue_side_effect() { diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2024.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2024.clang15.snap index 165b303c53..a07f19747f 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2024.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2024.clang15.snap @@ -52,8 +52,7 @@ pub unsafe extern "C" fn unary_with_side_effect() { side_effect(); !side_effect(); (side_effect() == 0) as ::core::ffi::c_int; - (b"\0".as_ptr() as *const ::core::ffi::c_char).offset(side_effect() as isize) - as *const ::core::ffi::c_char; + (b"\0".as_ptr() as *const ::core::ffi::c_char).offset(side_effect() as isize); } #[unsafe(no_mangle)] pub unsafe extern "C" fn inc_decl_with_rvalue_side_effect() { diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2021.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2021.clang15.snap index 06273532c4..fe8cd3c510 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2021.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2021.clang15.snap @@ -80,7 +80,7 @@ pub const STR_CONCATENATION: [::core::ffi::c_char; 18] = unsafe { pub const REF_MACRO: *const ::core::ffi::c_char = unsafe { NESTED_STR .as_ptr() - .offset(LITERAL_FLOAT as ::core::ffi::c_int as isize) as *const ::core::ffi::c_char + .offset(LITERAL_FLOAT as ::core::ffi::c_int as isize) }; pub const REF_LITERAL: *mut S = &LITERAL_STRUCT as *const S as *mut S; pub const TERNARY: ::core::ffi::c_int = if LITERAL_BOOL != 0 { diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2024.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2024.clang15.snap index f829606e9e..148cb164a1 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2024.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@macros.c.2024.clang15.snap @@ -80,7 +80,7 @@ pub const STR_CONCATENATION: [::core::ffi::c_char; 18] = unsafe { pub const REF_MACRO: *const ::core::ffi::c_char = unsafe { NESTED_STR .as_ptr() - .offset(LITERAL_FLOAT as ::core::ffi::c_int as isize) as *const ::core::ffi::c_char + .offset(LITERAL_FLOAT as ::core::ffi::c_int as isize) }; pub const REF_LITERAL: *mut S = &LITERAL_STRUCT as *const S as *mut S; pub const TERNARY: ::core::ffi::c_int = if LITERAL_BOOL != 0 { diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.aarch64.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.aarch64.clang15.snap index 82878c2eec..64e32d1e16 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.aarch64.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.aarch64.clang15.snap @@ -45,13 +45,12 @@ pub unsafe extern "C" fn VM_CallCompiled( while arg < MAX_VMMAIN_ARGS { *(image.offset( (programStack + 8 as ::core::ffi::c_int + arg * 4 as ::core::ffi::c_int) as isize, - ) as *mut byte as *mut ::core::ffi::c_int) = *args.offset(arg as isize); + ) as *mut ::core::ffi::c_int) = *args.offset(arg as isize); arg += 1; } - *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut byte - as *mut ::core::ffi::c_int) = 0 as ::core::ffi::c_int; - *(image.offset(programStack as isize) as *mut byte as *mut ::core::ffi::c_int) = - -1 as ::core::ffi::c_int; + *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut ::core::ffi::c_int) = + 0 as ::core::ffi::c_int; + *(image.offset(programStack as isize) as *mut ::core::ffi::c_int) = -1 as ::core::ffi::c_int; entryPoint = (*vm).codeBase.offset((*vm).entryOfs as isize); opStack = (&raw mut stack as *mut byte as *mut ::core::ffi::c_int) .offset(16 as ::core::ffi::c_int as isize); diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.x86_64.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.x86_64.clang15.snap index cd57f2f875..18a74e9a60 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.x86_64.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2021.x86_64.clang15.snap @@ -46,13 +46,12 @@ pub unsafe extern "C" fn VM_CallCompiled( while arg < MAX_VMMAIN_ARGS { *(image.offset( (programStack + 8 as ::core::ffi::c_int + arg * 4 as ::core::ffi::c_int) as isize, - ) as *mut byte as *mut ::core::ffi::c_int) = *args.offset(arg as isize); + ) as *mut ::core::ffi::c_int) = *args.offset(arg as isize); arg += 1; } - *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut byte - as *mut ::core::ffi::c_int) = 0 as ::core::ffi::c_int; - *(image.offset(programStack as isize) as *mut byte as *mut ::core::ffi::c_int) = - -1 as ::core::ffi::c_int; + *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut ::core::ffi::c_int) = + 0 as ::core::ffi::c_int; + *(image.offset(programStack as isize) as *mut ::core::ffi::c_int) = -1 as ::core::ffi::c_int; entryPoint = (*vm).codeBase.offset((*vm).entryOfs as isize); opStack = (&raw mut stack as *mut byte as *mut ::core::ffi::c_int) .offset(16 as ::core::ffi::c_int as isize); diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.aarch64.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.aarch64.clang15.snap index ec81782ca6..e341e265a7 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.aarch64.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.aarch64.clang15.snap @@ -45,13 +45,12 @@ pub unsafe extern "C" fn VM_CallCompiled( while arg < MAX_VMMAIN_ARGS { *(image.offset( (programStack + 8 as ::core::ffi::c_int + arg * 4 as ::core::ffi::c_int) as isize, - ) as *mut byte as *mut ::core::ffi::c_int) = *args.offset(arg as isize); + ) as *mut ::core::ffi::c_int) = *args.offset(arg as isize); arg += 1; } - *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut byte - as *mut ::core::ffi::c_int) = 0 as ::core::ffi::c_int; - *(image.offset(programStack as isize) as *mut byte as *mut ::core::ffi::c_int) = - -1 as ::core::ffi::c_int; + *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut ::core::ffi::c_int) = + 0 as ::core::ffi::c_int; + *(image.offset(programStack as isize) as *mut ::core::ffi::c_int) = -1 as ::core::ffi::c_int; entryPoint = (*vm).codeBase.offset((*vm).entryOfs as isize); opStack = (&raw mut stack as *mut byte as *mut ::core::ffi::c_int) .offset(16 as ::core::ffi::c_int as isize); diff --git a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.x86_64.clang15.snap b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.x86_64.clang15.snap index 2f4ed3431b..414f89df1c 100644 --- a/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.x86_64.clang15.snap +++ b/c2rust-transpile/tests/snapshots/snapshots__transpile@vm_x86.c.2024.x86_64.clang15.snap @@ -46,13 +46,12 @@ pub unsafe extern "C" fn VM_CallCompiled( while arg < MAX_VMMAIN_ARGS { *(image.offset( (programStack + 8 as ::core::ffi::c_int + arg * 4 as ::core::ffi::c_int) as isize, - ) as *mut byte as *mut ::core::ffi::c_int) = *args.offset(arg as isize); + ) as *mut ::core::ffi::c_int) = *args.offset(arg as isize); arg += 1; } - *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut byte - as *mut ::core::ffi::c_int) = 0 as ::core::ffi::c_int; - *(image.offset(programStack as isize) as *mut byte as *mut ::core::ffi::c_int) = - -1 as ::core::ffi::c_int; + *(image.offset((programStack + 4 as ::core::ffi::c_int) as isize) as *mut ::core::ffi::c_int) = + 0 as ::core::ffi::c_int; + *(image.offset(programStack as isize) as *mut ::core::ffi::c_int) = -1 as ::core::ffi::c_int; entryPoint = (*vm).codeBase.offset((*vm).entryOfs as isize); opStack = (&raw mut stack as *mut byte as *mut ::core::ffi::c_int) .offset(16 as ::core::ffi::c_int as isize);