Skip to content

Commit dcf4b56

Browse files
committed
transpile: Override pointer difference expression type to PtrDiff
1 parent ab16ca4 commit dcf4b56

3 files changed

Lines changed: 22 additions & 14 deletions

File tree

c2rust-transpile/src/c_ast/mod.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,19 +1356,29 @@ impl TypedAstContext {
13561356
let lhs_resolved_ty = self.ast_context.resolve_type(lhs_type_id.ctype);
13571357
let rhs_resolved_ty = self.ast_context.resolve_type(rhs_type_id.ctype);
13581358

1359-
let neither_ptr = !lhs_resolved_ty.kind.is_pointer()
1360-
&& !rhs_resolved_ty.kind.is_pointer();
1361-
1362-
if op.all_types_same() && neither_ptr {
1363-
if CTypeKind::PULLBACK_KINDS.contains(&lhs_resolved_ty.kind) {
1359+
if op == CBinOp::Subtract
1360+
&& lhs_resolved_ty.kind.is_pointer()
1361+
&& rhs_resolved_ty.kind.is_pointer()
1362+
{
1363+
// Pointer difference operator should return `ptrdiff_t`.
1364+
let new_type_id =
1365+
self.ast_context.type_for_kind(&CTypeKind::PtrDiff).unwrap();
1366+
Some(CQualTypeId::new(new_type_id))
1367+
} else {
1368+
let neither_ptr = !lhs_resolved_ty.kind.is_pointer()
1369+
&& !rhs_resolved_ty.kind.is_pointer();
1370+
1371+
if op.all_types_same() && neither_ptr {
1372+
if CTypeKind::PULLBACK_KINDS.contains(&lhs_resolved_ty.kind) {
1373+
Some(lhs_type_id)
1374+
} else {
1375+
Some(rhs_type_id)
1376+
}
1377+
} else if op.is_bitshift() {
13641378
Some(lhs_type_id)
13651379
} else {
1366-
Some(rhs_type_id)
1380+
return;
13671381
}
1368-
} else if op.is_bitshift() {
1369-
Some(lhs_type_id)
1370-
} else {
1371-
return;
13721382
}
13731383
}
13741384
CExprKind::Unary(_ty, op, e, _idk) => op.expected_result_type(

c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2021.clang15.snap

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,5 @@ pub unsafe extern "C" fn pointer_arithmetic() {
9090
let mut p1: *mut ::core::ffi::c_int = &raw mut i1 as *mut ::core::ffi::c_int;
9191
let mut p2: *mut ::core::ffi::c_int = &raw mut i2 as *mut ::core::ffi::c_int;
9292
let mut diff: ptrdiff_t = p1.offset_from(p2);
93-
let mut diff_int: ::core::ffi::c_int =
94-
p1.offset_from(p2) as ::core::ffi::c_long as ::core::ffi::c_int;
93+
let mut diff_int: ::core::ffi::c_int = p1.offset_from(p2) as ::core::ffi::c_int;
9594
}

c2rust-transpile/tests/snapshots/snapshots__transpile@exprs.c.2024.clang15.snap

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,5 @@ pub unsafe extern "C" fn pointer_arithmetic() {
9090
let mut p1: *mut ::core::ffi::c_int = &raw mut i1 as *mut ::core::ffi::c_int;
9191
let mut p2: *mut ::core::ffi::c_int = &raw mut i2 as *mut ::core::ffi::c_int;
9292
let mut diff: ptrdiff_t = p1.offset_from(p2);
93-
let mut diff_int: ::core::ffi::c_int =
94-
p1.offset_from(p2) as ::core::ffi::c_long as ::core::ffi::c_int;
93+
let mut diff_int: ::core::ffi::c_int = p1.offset_from(p2) as ::core::ffi::c_int;
9594
}

0 commit comments

Comments
 (0)