Skip to content

Commit 40761b9

Browse files
committed
transpile: Override pointer difference expression type to PtrDiff
1 parent d294d00 commit 40761b9

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
@@ -1316,19 +1316,29 @@ impl TypedAstContext {
13161316
let lhs_resolved_ty = self.ast_context.resolve_type(lhs_type_id.ctype);
13171317
let rhs_resolved_ty = self.ast_context.resolve_type(rhs_type_id.ctype);
13181318

1319-
let neither_ptr = !lhs_resolved_ty.kind.is_pointer()
1320-
&& !rhs_resolved_ty.kind.is_pointer();
1321-
1322-
if op.all_types_same() && neither_ptr {
1323-
if CTypeKind::PULLBACK_KINDS.contains(&lhs_resolved_ty.kind) {
1319+
if op == CBinOp::Subtract
1320+
&& lhs_resolved_ty.kind.is_pointer()
1321+
&& rhs_resolved_ty.kind.is_pointer()
1322+
{
1323+
// Pointer difference operator should return `ptrdiff_t`.
1324+
let new_type_id =
1325+
self.ast_context.type_for_kind(&CTypeKind::PtrDiff).unwrap();
1326+
Some(CQualTypeId::new(new_type_id))
1327+
} else {
1328+
let neither_ptr = !lhs_resolved_ty.kind.is_pointer()
1329+
&& !rhs_resolved_ty.kind.is_pointer();
1330+
1331+
if op.all_types_same() && neither_ptr {
1332+
if CTypeKind::PULLBACK_KINDS.contains(&lhs_resolved_ty.kind) {
1333+
Some(lhs_type_id)
1334+
} else {
1335+
Some(rhs_type_id)
1336+
}
1337+
} else if op.is_bitshift() {
13241338
Some(lhs_type_id)
13251339
} else {
1326-
Some(rhs_type_id)
1340+
return;
13271341
}
1328-
} else if op.is_bitshift() {
1329-
Some(lhs_type_id)
1330-
} else {
1331-
return;
13321342
}
13331343
}
13341344
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)