Skip to content

Commit f162919

Browse files
authored
Fix compilation error on 32-bit Apple (#1407)
1 parent d50036a commit f162919

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ jobs:
233233
- run: cargo check -Z build-std --target=mips64el-unknown-linux-gnuabi64 --features=all-apis
234234
- run: cargo check -Z build-std --target=powerpc-unknown-linux-musl --features=all-apis
235235
- run: cargo check -Z build-std --target=powerpc64le-unknown-linux-musl --features=all-apis
236+
- run: cargo check -Z build-std --target=armv7k-apple-watchos --features=all-apis
236237

237238

238239
test:

src/backend/libc/fs/syscalls.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2654,12 +2654,12 @@ pub(crate) fn fremovexattr(fd: BorrowedFd<'_>, name: &CStr) -> io::Result<()> {
26542654
/// See [`crate::timespec::fix_negative_nsec`] for details.
26552655
#[cfg(apple)]
26562656
fn fix_negative_stat_nsecs(mut stat: Stat) -> Stat {
2657-
stat.st_atime_nsec =
2658-
crate::timespec::fix_negative_nsecs(&mut stat.st_atime, stat.st_atime_nsec as _) as _;
2659-
stat.st_mtime_nsec =
2660-
crate::timespec::fix_negative_nsecs(&mut stat.st_mtime, stat.st_mtime_nsec as _) as _;
2661-
stat.st_ctime_nsec =
2662-
crate::timespec::fix_negative_nsecs(&mut stat.st_ctime, stat.st_ctime_nsec as _) as _;
2657+
(stat.st_atime, stat.st_atime_nsec) =
2658+
crate::timespec::fix_negative_nsecs(stat.st_atime, stat.st_atime_nsec);
2659+
(stat.st_mtime, stat.st_mtime_nsec) =
2660+
crate::timespec::fix_negative_nsecs(stat.st_mtime, stat.st_mtime_nsec);
2661+
(stat.st_ctime, stat.st_ctime_nsec) =
2662+
crate::timespec::fix_negative_nsecs(stat.st_ctime, stat.st_ctime_nsec);
26632663
stat
26642664
}
26652665

src/backend/libc/time/syscalls.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,10 @@ fn timerfd_gettime_old(fd: BorrowedFd<'_>) -> io::Result<Itimerspec> {
475475

476476
/// See [`crate::timespec::fix_negative_nsecs`] for details.
477477
#[cfg(apple)]
478+
#[cfg(not(fix_y2038))]
478479
fn fix_negative_timespec_nsecs(mut ts: Timespec) -> Timespec {
479-
ts.tv_nsec = crate::timespec::fix_negative_nsecs(&mut ts.tv_sec, ts.tv_nsec as _) as _;
480+
let (sec, nsec) = crate::timespec::fix_negative_nsecs(ts.tv_sec as _, ts.tv_nsec as _);
481+
ts.tv_sec = sec as _;
482+
ts.tv_nsec = nsec as _;
480483
ts
481484
}

src/timespec.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -338,31 +338,34 @@ pub(crate) fn option_as_libc_timespec_ptr(timespec: Option<&Timespec>) -> *const
338338
/// [here]: https://github.com/rust-lang/rust/issues/108277#issuecomment-1787057158
339339
#[cfg(apple)]
340340
#[inline]
341-
pub(crate) fn fix_negative_nsecs(secs: &mut i64, mut nsecs: i32) -> i32 {
341+
pub(crate) fn fix_negative_nsecs(
342+
mut secs: c::time_t,
343+
mut nsecs: c::c_long,
344+
) -> (c::time_t, c::c_long) {
342345
#[cold]
343-
fn adjust(secs: &mut i64, nsecs: i32) -> i32 {
346+
fn adjust(secs: &mut c::time_t, nsecs: c::c_long) -> c::c_long {
344347
assert!(nsecs >= -1_000_000_000);
345348
assert!(*secs < 0);
346-
assert!(*secs > i64::MIN);
349+
assert!(*secs > c::time_t::MIN);
347350
*secs -= 1;
348351
nsecs + 1_000_000_000
349352
}
350353

351354
if nsecs < 0 {
352-
nsecs = adjust(secs, nsecs);
355+
nsecs = adjust(&mut secs, nsecs);
353356
}
354-
nsecs
357+
(secs, nsecs)
355358
}
356359

357360
#[cfg(apple)]
358361
#[test]
359362
fn test_negative_timestamps() {
360363
let mut secs = -59;
361364
let mut nsecs = -900_000_000;
362-
nsecs = fix_negative_nsecs(&mut secs, nsecs);
365+
(secs, nsecs) = fix_negative_nsecs(secs, nsecs);
363366
assert_eq!(secs, -60);
364367
assert_eq!(nsecs, 100_000_000);
365-
nsecs = fix_negative_nsecs(&mut secs, nsecs);
368+
(secs, nsecs) = fix_negative_nsecs(secs, nsecs);
366369
assert_eq!(secs, -60);
367370
assert_eq!(nsecs, 100_000_000);
368371
}

0 commit comments

Comments
 (0)