Skip to content

Commit b783d04

Browse files
committed
transpile: add generics test
1 parent 0bb986a commit b783d04

4 files changed

Lines changed: 120 additions & 0 deletions

File tree

c2rust-transpile/tests/snapshots.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,11 @@ fn test_fn_attrs() {
374374
transpile("fn_attrs.c").run();
375375
}
376376

377+
#[test]
378+
fn test_generics() {
379+
transpile("generics.c").run();
380+
}
381+
377382
#[test]
378383
fn test_gotos() {
379384
transpile("gotos.c").run();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#define inc(x) (_Generic((x), \
2+
float: (x) + 1.0f, \
3+
double: (x) + 1.0, \
4+
default: (x) + 1))
5+
6+
struct s { int x; };
7+
struct t { int y; };
8+
#define cast(p) (_Generic((p), \
9+
const struct s *: (const struct t *)(p), \
10+
struct s *: (struct t *)(p)))
11+
12+
#define unqual_typeof(x) typeof(_Generic((x), \
13+
int: (int)0, const int: (int)0, default: (x)))
14+
15+
void foo() {
16+
int x = inc(42);
17+
double y = inc(42.0);
18+
float z = inc(42.0f);
19+
20+
int n = 0;
21+
_Generic((n++), int: n, default: n); // n must end up 0, not 1
22+
23+
// No default
24+
int m = 0;
25+
n = _Generic((m), int: m);
26+
27+
struct s s;
28+
struct s *p1 = &s;
29+
const struct s *p2 = &s;
30+
struct t *t1 = cast(p1);
31+
const struct t *t2 = cast(p2);
32+
33+
const int cx = n;
34+
unqual_typeof(x) ut_y = cx;
35+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
source: c2rust-transpile/tests/snapshots.rs
3+
expression: cat tests/snapshots/generics.2021.clang15.rs
4+
---
5+
#![allow(
6+
clippy::missing_safety_doc,
7+
dead_code,
8+
non_camel_case_types,
9+
non_snake_case,
10+
non_upper_case_globals,
11+
unused_assignments,
12+
unused_mut
13+
)]
14+
#![feature(raw_ref_op)]
15+
#[derive(Copy, Clone)]
16+
#[repr(C)]
17+
pub struct s {
18+
pub x: ::core::ffi::c_int,
19+
}
20+
#[derive(Copy, Clone)]
21+
#[repr(C)]
22+
pub struct t {
23+
pub y: ::core::ffi::c_int,
24+
}
25+
#[no_mangle]
26+
pub unsafe extern "C" fn foo() {
27+
let mut x: ::core::ffi::c_int = 42 as ::core::ffi::c_int + 1 as ::core::ffi::c_int;
28+
let mut y: ::core::ffi::c_double = 42.0f64 + 1.0f64;
29+
let mut z: ::core::ffi::c_float = 42.0f32 + 1.0f32;
30+
let mut n: ::core::ffi::c_int = 0 as ::core::ffi::c_int;
31+
let mut m: ::core::ffi::c_int = 0 as ::core::ffi::c_int;
32+
n = m;
33+
let mut s: s = s { x: 0 };
34+
let mut p1: *mut s = &raw mut s;
35+
let mut p2: *const s = &raw mut s;
36+
let mut t1: *mut t = p1 as *mut t;
37+
let mut t2: *const t = p2 as *const t;
38+
let cx: ::core::ffi::c_int = n;
39+
let mut ut_y: ::core::ffi::c_int = cx as ::core::ffi::c_int;
40+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
source: c2rust-transpile/tests/snapshots.rs
3+
expression: cat tests/snapshots/generics.2024.clang15.rs
4+
---
5+
#![allow(
6+
clippy::missing_safety_doc,
7+
dead_code,
8+
non_camel_case_types,
9+
non_snake_case,
10+
non_upper_case_globals,
11+
unsafe_op_in_unsafe_fn,
12+
unused_assignments,
13+
unused_mut
14+
)]
15+
#[derive(Copy, Clone)]
16+
#[repr(C)]
17+
pub struct s {
18+
pub x: ::core::ffi::c_int,
19+
}
20+
#[derive(Copy, Clone)]
21+
#[repr(C)]
22+
pub struct t {
23+
pub y: ::core::ffi::c_int,
24+
}
25+
#[unsafe(no_mangle)]
26+
pub unsafe extern "C" fn foo() {
27+
let mut x: ::core::ffi::c_int = 42 as ::core::ffi::c_int + 1 as ::core::ffi::c_int;
28+
let mut y: ::core::ffi::c_double = 42.0f64 + 1.0f64;
29+
let mut z: ::core::ffi::c_float = 42.0f32 + 1.0f32;
30+
let mut n: ::core::ffi::c_int = 0 as ::core::ffi::c_int;
31+
let mut m: ::core::ffi::c_int = 0 as ::core::ffi::c_int;
32+
n = m;
33+
let mut s: s = s { x: 0 };
34+
let mut p1: *mut s = &raw mut s;
35+
let mut p2: *const s = &raw mut s;
36+
let mut t1: *mut t = p1 as *mut t;
37+
let mut t2: *const t = p2 as *const t;
38+
let cx: ::core::ffi::c_int = n;
39+
let mut ut_y: ::core::ffi::c_int = cx as ::core::ffi::c_int;
40+
}

0 commit comments

Comments
 (0)