Skip to content

Commit 19cbcc4

Browse files
committed
transpile: Override pointer difference expression type to PtrDiff
1 parent 9d79e3b commit 19cbcc4

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
@@ -1351,19 +1351,29 @@ impl TypedAstContext {
13511351
let lhs_resolved_ty = self.ast_context.resolve_type(lhs_type_id.ctype);
13521352
let rhs_resolved_ty = self.ast_context.resolve_type(rhs_type_id.ctype);
13531353

1354-
let neither_ptr = !lhs_resolved_ty.kind.is_pointer()
1355-
&& !rhs_resolved_ty.kind.is_pointer();
1356-
1357-
if op.all_types_same() && neither_ptr {
1358-
if CTypeKind::PULLBACK_KINDS.contains(&lhs_resolved_ty.kind) {
1354+
if op == CBinOp::Subtract
1355+
&& lhs_resolved_ty.kind.is_pointer()
1356+
&& rhs_resolved_ty.kind.is_pointer()
1357+
{
1358+
// Pointer difference operator should return `ptrdiff_t`.
1359+
let new_type_id =
1360+
self.ast_context.type_for_kind(&CTypeKind::PtrDiff).unwrap();
1361+
Some(CQualTypeId::new(new_type_id))
1362+
} else {
1363+
let neither_ptr = !lhs_resolved_ty.kind.is_pointer()
1364+
&& !rhs_resolved_ty.kind.is_pointer();
1365+
1366+
if op.all_types_same() && neither_ptr {
1367+
if CTypeKind::PULLBACK_KINDS.contains(&lhs_resolved_ty.kind) {
1368+
Some(lhs_type_id)
1369+
} else {
1370+
Some(rhs_type_id)
1371+
}
1372+
} else if op.is_bitshift() {
13591373
Some(lhs_type_id)
13601374
} else {
1361-
Some(rhs_type_id)
1375+
return;
13621376
}
1363-
} else if op.is_bitshift() {
1364-
Some(lhs_type_id)
1365-
} else {
1366-
return;
13671377
}
13681378
}
13691379
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)