From e8df4676be2f39e767102ea76b067cb8d3149748 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Thu, 5 Nov 2026 15:08:02 +0000 Subject: [PATCH 1/2] Add a refcount type rule for FILE --- rules/stdio/tgt_refcount.rs | 4 ++++ tests/unit/printfs.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/rules/stdio/tgt_refcount.rs b/rules/stdio/tgt_refcount.rs index eddb40b74b..0eccbd1f9b 100644 --- a/rules/stdio/tgt_refcount.rs +++ b/rules/stdio/tgt_refcount.rs @@ -7,6 +7,10 @@ fn t1() -> Ptr { Ptr::null() } +fn t2() -> CFile { + unimplemented!() +} + fn f1(a0: Ptr, a1: Ptr) -> Ptr { match CFile::open(&a0.to_rust_string(), &a1.to_rust_string()) { Some(__f) => Ptr::alloc(__f), diff --git a/tests/unit/printfs.cpp b/tests/unit/printfs.cpp index 087f9daacc..ec6c1c2b4c 100644 --- a/tests/unit/printfs.cpp +++ b/tests/unit/printfs.cpp @@ -13,6 +13,8 @@ template void log_to(FILE *out, const char *fmt, Args... args) { void log_fmt(const char *fmt, int v) { printf(fmt, v); } +static void put(FILE &out, const char *s) { fputs(s, &out); } + int main() { fprintf(stdout, "%s\n", "fprintf stdout"); fprintf(stdout, "%d %u %ld\n", 1, 2U, 3L); @@ -29,5 +31,7 @@ int main() { log_to(stderr, "%d\n", 5); log_fmt("%d\n", 6); printf("{} %ju %jd\n", (uintmax_t)5, (intmax_t)-6); + FILE *fp = stdout; + put(*fp, "value\n"); return 0; } From ff065dfb73ea4e86f28f96e805db15ba946f474c Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Thu, 5 Nov 2026 15:25:30 +0000 Subject: [PATCH 2/2] Update tests --- tests/unit/out/refcount/printfs.rs | 14 ++++++++++++++ tests/unit/out/unsafe/printfs.rs | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/tests/unit/out/refcount/printfs.rs b/tests/unit/out/refcount/printfs.rs index d59fdc07a3..16e7e5d88d 100644 --- a/tests/unit/out/refcount/printfs.rs +++ b/tests/unit/out/refcount/printfs.rs @@ -42,6 +42,18 @@ pub fn log_fmt_4(mut fmt: Ptr, mut v: i32) { libcc2rs::c_stdout().with_mut(|__f| __f.write(__s.as_bytes())) as i32 }; } +pub fn put_5(out: Ptr, mut s: Ptr) { + match ({ (out).clone() },) { + (mut __tmp_0,) => { + match s + .with_c_bytes(|__bytes| __tmp_0.with_mut(|__f| __f.write(__bytes)) == __bytes.len()) + { + true => 0, + false => -1, + } + } + }; +} pub fn main() { __cpp2rust_init_globals(); std::process::exit(main_0()); @@ -91,6 +103,8 @@ fn main_0() -> i32 { }); ({ log_fmt_4(Ptr::::from_string_literal(b"%d\n"), 6) }); println!("{{}} {} {}", 5_u64, (-6_i32 as i64)); + let mut fp: Ptr = libcc2rs::c_stdout(); + ({ put_5((fp).clone(), Ptr::::from_string_literal(b"value\n")) }); return 0; } pub fn __cpp2rust_init_globals() {} diff --git a/tests/unit/out/unsafe/printfs.rs b/tests/unit/out/unsafe/printfs.rs index 2436add1f3..36b8e14895 100644 --- a/tests/unit/out/unsafe/printfs.rs +++ b/tests/unit/out/unsafe/printfs.rs @@ -42,6 +42,9 @@ pub unsafe fn log_to_3(mut out: *mut ::libc::FILE, mut fmt: *const libc::c_char, pub unsafe fn log_fmt_4(mut fmt: *const libc::c_char, mut v: i32) { (unsafe { libc::printf(fmt as *const libc::c_char, (v)) }); } +pub unsafe fn put_5(out: *mut ::libc::FILE, mut s: *const libc::c_char) { + libc::fputs(s, (out)); +} pub fn main() { unsafe { __cpp2rust_init_globals(); @@ -127,6 +130,8 @@ unsafe fn main_0() -> i32 { (-6_i32 as i64), ) }); + let mut fp: *mut ::libc::FILE = libcc2rs::stdout_unsafe(); + (unsafe { put_5(&mut (*fp), c"value\n".as_ptr()) }); return 0; } pub unsafe fn __cpp2rust_init_globals() {}