Skip to content

Commit d30044f

Browse files
committed
add c-variadic const eval test
1 parent fd10f4e commit d30044f

1 file changed

Lines changed: 100 additions & 0 deletions

File tree

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
//@ run-pass
2+
3+
#![feature(c_variadic)]
4+
#![feature(const_destruct)]
5+
#![feature(c_variadic_const)]
6+
7+
use std::ffi::VaList;
8+
9+
fn ignores_arguments() {
10+
const unsafe extern "C" fn variadic(_: ...) {}
11+
12+
const {
13+
unsafe { variadic() };
14+
unsafe { variadic(1, 2, 3) };
15+
}
16+
}
17+
18+
fn echo() {
19+
const unsafe extern "C" fn variadic(mut ap: ...) -> i32 {
20+
ap.arg()
21+
}
22+
23+
assert_eq!(unsafe { variadic(1) }, 1);
24+
assert_eq!(unsafe { variadic(3, 2, 1) }, 3);
25+
26+
const {
27+
assert!(unsafe { variadic(1) } == 1);
28+
assert!(unsafe { variadic(3, 2, 1) } == 3);
29+
}
30+
}
31+
32+
fn forward_by_val() {
33+
const unsafe fn helper(mut ap: VaList) -> i32 {
34+
ap.arg()
35+
}
36+
37+
const unsafe extern "C" fn variadic(ap: ...) -> i32 {
38+
helper(ap)
39+
}
40+
41+
assert_eq!(unsafe { variadic(1) }, 1);
42+
assert_eq!(unsafe { variadic(3, 2, 1) }, 3);
43+
44+
const {
45+
assert!(unsafe { variadic(1) } == 1);
46+
assert!(unsafe { variadic(3, 2, 1) } == 3);
47+
}
48+
}
49+
50+
fn forward_by_ref() {
51+
const unsafe fn helper(ap: &mut VaList) -> i32 {
52+
ap.arg()
53+
}
54+
55+
const unsafe extern "C" fn variadic(mut ap: ...) -> i32 {
56+
helper(&mut ap)
57+
}
58+
59+
assert_eq!(unsafe { variadic(1) }, 1);
60+
assert_eq!(unsafe { variadic(3, 2, 1) }, 3);
61+
62+
const {
63+
assert!(unsafe { variadic(1) } == 1);
64+
assert!(unsafe { variadic(3, 2, 1) } == 3);
65+
}
66+
}
67+
68+
#[allow(improper_ctypes_definitions)]
69+
fn nested() {
70+
const unsafe fn helper(mut ap1: VaList, mut ap2: VaList) -> (i32, i32) {
71+
(ap1.arg(), ap2.arg())
72+
}
73+
74+
const unsafe extern "C" fn variadic2(ap1: VaList, ap2: ...) -> (i32, i32) {
75+
helper(ap1, ap2)
76+
}
77+
78+
const unsafe extern "C" fn variadic1(ap1: ...) -> (i32, i32) {
79+
variadic2(ap1, 2, 2)
80+
}
81+
82+
assert_eq!(unsafe { variadic1(1) }, (1, 2));
83+
84+
const {
85+
let (a, b) = unsafe { variadic1(1, 1) };
86+
87+
assert!(a != 2);
88+
assert!(a == 1);
89+
assert!(b != 1);
90+
assert!(b == 2);
91+
}
92+
}
93+
94+
fn main() {
95+
ignores_arguments();
96+
echo();
97+
forward_by_val();
98+
forward_by_ref();
99+
nested();
100+
}

0 commit comments

Comments
 (0)