]> git.lizzy.rs Git - rust.git/blob - src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs
Rollup merge of #100897 - RalfJung:const-not-to-mutable, r=lcnr
[rust.git] / src / test / run-make-fulldeps / c-link-to-rust-va-list-fn / checkrust.rs
1 #![crate_type = "staticlib"]
2 #![feature(c_variadic)]
3 #![feature(rustc_private)]
4
5 extern crate libc;
6
7 use libc::{c_char, c_double, c_int, c_long, c_longlong};
8 use std::ffi::VaList;
9 use std::ffi::{CString, CStr};
10
11 macro_rules! continue_if {
12     ($cond:expr) => {
13         if !($cond) {
14             return 0xff;
15         }
16     }
17 }
18
19 unsafe fn compare_c_str(ptr: *const c_char, val: &str) -> bool {
20     let cstr0 = CStr::from_ptr(ptr);
21     match CString::new(val) {
22         Ok(cstr1) => &*cstr1 == cstr0,
23         Err(_) => false,
24     }
25 }
26
27 #[no_mangle]
28 pub unsafe extern "C" fn check_list_0(mut ap: VaList) -> usize {
29     continue_if!(ap.arg::<c_longlong>() == 1);
30     continue_if!(ap.arg::<c_int>() == 2);
31     continue_if!(ap.arg::<c_longlong>() == 3);
32     0
33 }
34
35 #[no_mangle]
36 pub unsafe extern "C" fn check_list_1(mut ap: VaList) -> usize {
37     continue_if!(ap.arg::<c_int>() == -1);
38     continue_if!(ap.arg::<c_char>() == 'A' as c_char);
39     continue_if!(ap.arg::<c_char>() == '4' as c_char);
40     continue_if!(ap.arg::<c_char>() == ';' as c_char);
41     continue_if!(ap.arg::<c_int>() == 0x32);
42     continue_if!(ap.arg::<c_int>() == 0x10000001);
43     continue_if!(compare_c_str(ap.arg::<*const c_char>(), "Valid!"));
44     0
45 }
46
47 #[no_mangle]
48 pub unsafe extern "C" fn check_list_2(mut ap: VaList) -> usize {
49     continue_if!(ap.arg::<c_double>().floor() == 3.14f64.floor());
50     continue_if!(ap.arg::<c_long>() == 12);
51     continue_if!(ap.arg::<c_char>() == 'a' as c_char);
52     continue_if!(ap.arg::<c_double>().floor() == 6.18f64.floor());
53     continue_if!(compare_c_str(ap.arg::<*const c_char>(), "Hello"));
54     continue_if!(ap.arg::<c_int>() == 42);
55     continue_if!(compare_c_str(ap.arg::<*const c_char>(), "World"));
56     0
57 }
58
59 #[no_mangle]
60 pub unsafe extern "C" fn check_list_copy_0(mut ap: VaList) -> usize {
61     continue_if!(ap.arg::<c_double>().floor() == 6.28f64.floor());
62     continue_if!(ap.arg::<c_int>() == 16);
63     continue_if!(ap.arg::<c_char>() == 'A' as c_char);
64     continue_if!(compare_c_str(ap.arg::<*const c_char>(), "Skip Me!"));
65     ap.with_copy(|mut ap| {
66         if compare_c_str(ap.arg::<*const c_char>(), "Correct") {
67             0
68         } else {
69             0xff
70         }
71     })
72 }
73
74 #[no_mangle]
75 pub unsafe extern "C" fn check_varargs_0(_: c_int, mut ap: ...) -> usize {
76     continue_if!(ap.arg::<c_int>() == 42);
77     continue_if!(compare_c_str(ap.arg::<*const c_char>(), "Hello, World!"));
78     0
79 }
80
81 #[no_mangle]
82 pub unsafe extern "C" fn check_varargs_1(_: c_int, mut ap: ...) -> usize {
83     continue_if!(ap.arg::<c_double>().floor() == 3.14f64.floor());
84     continue_if!(ap.arg::<c_long>() == 12);
85     continue_if!(ap.arg::<c_char>() == 'A' as c_char);
86     continue_if!(ap.arg::<c_longlong>() == 1);
87     0
88 }
89
90 #[no_mangle]
91 pub unsafe extern "C" fn check_varargs_2(_: c_int, _ap: ...) -> usize {
92     0
93 }
94
95 #[no_mangle]
96 pub unsafe extern "C" fn check_varargs_3(_: c_int, mut ap: ...) -> usize {
97     continue_if!(ap.arg::<c_int>() == 1);
98     continue_if!(ap.arg::<c_int>() == 2);
99     continue_if!(ap.arg::<c_int>() == 3);
100     continue_if!(ap.arg::<c_int>() == 4);
101     continue_if!(ap.arg::<c_int>() == 5);
102     continue_if!(ap.arg::<c_int>() == 6);
103     continue_if!(ap.arg::<c_int>() == 7);
104     continue_if!(ap.arg::<c_int>() == 8);
105     continue_if!(ap.arg::<c_int>() == 9);
106     continue_if!(ap.arg::<c_int>() == 10);
107     0
108 }
109
110 #[no_mangle]
111 pub unsafe extern "C" fn check_varargs_4(_: c_double, mut ap: ...) -> usize {
112     continue_if!(ap.arg::<c_double>() == 1.0);
113     continue_if!(ap.arg::<c_double>() == 2.0);
114     continue_if!(ap.arg::<c_double>() == 3.0);
115     continue_if!(ap.arg::<c_double>() == 4.0);
116     continue_if!(ap.arg::<c_double>() == 5.0);
117     continue_if!(ap.arg::<c_double>() == 6.0);
118     continue_if!(ap.arg::<c_double>() == 7.0);
119     continue_if!(ap.arg::<c_double>() == 8.0);
120     continue_if!(ap.arg::<c_double>() == 9.0);
121     continue_if!(ap.arg::<c_double>() == 10.0);
122     0
123 }
124
125 #[no_mangle]
126 pub unsafe extern "C" fn check_varargs_5(_: c_int, mut ap: ...) -> usize {
127     continue_if!(ap.arg::<c_double>() == 1.0);
128     continue_if!(ap.arg::<c_int>() == 1);
129     continue_if!(ap.arg::<c_double>() == 2.0);
130     continue_if!(ap.arg::<c_int>() == 2);
131     continue_if!(ap.arg::<c_double>() == 3.0);
132     continue_if!(ap.arg::<c_int>() == 3);
133     continue_if!(ap.arg::<c_double>() == 4.0);
134     continue_if!(ap.arg::<c_int>() == 4);
135     continue_if!(ap.arg::<c_int>() == 5);
136     continue_if!(ap.arg::<c_double>() == 5.0);
137     continue_if!(ap.arg::<c_int>() == 6);
138     continue_if!(ap.arg::<c_double>() == 6.0);
139     continue_if!(ap.arg::<c_int>() == 7);
140     continue_if!(ap.arg::<c_double>() == 7.0);
141     continue_if!(ap.arg::<c_int>() == 8);
142     continue_if!(ap.arg::<c_double>() == 8.0);
143     continue_if!(ap.arg::<c_int>() == 9);
144     continue_if!(ap.arg::<c_double>() == 9.0);
145     continue_if!(ap.arg::<c_int>() == 10);
146     continue_if!(ap.arg::<c_double>() == 10.0);
147     0
148 }