diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2020-07-22 09:29:00 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-22 09:29:00 -0700 |
| commit | dade0f1f6c25dde9974b61b76f0e9dc01cf3ea68 (patch) | |
| tree | 6c1d292370a878966e6244934d740f086ed53b3f /src/test | |
| parent | 69d68f90964a46e479eec02a4d9c45aaaa45b411 (diff) | |
| parent | 8b58eb9dc49254926c91690380c065403b10fbb8 (diff) | |
| download | rust-dade0f1f6c25dde9974b61b76f0e9dc01cf3ea68.tar.gz rust-dade0f1f6c25dde9974b61b76f0e9dc01cf3ea68.zip | |
Rollup merge of #73655 - JamieCunliffe:jamie_va-args-c, r=nikic
va_args implementation for AAPCS. Implement the va args in codegen for AAPCS, this will be used as the default va_args implementation for AArch64 rather than the va_args llvm-ir as it currently is. This should fix the following issues: https://github.com/rust-lang/rust/issues/56475 https://github.com/rust-lang/rust/issues/72579
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs | 55 | ||||
| -rw-r--r-- | src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/test.c | 10 |
2 files changed, 65 insertions, 0 deletions
diff --git a/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs b/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs index a0a5b141ec0..5830ef033d3 100644 --- a/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs +++ b/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs @@ -91,3 +91,58 @@ pub unsafe extern "C" fn check_varargs_1(_: c_int, mut ap: ...) -> usize { pub unsafe extern "C" fn check_varargs_2(_: c_int, _ap: ...) -> usize { 0 } + +#[no_mangle] +pub unsafe extern "C" fn check_varargs_3(_: c_int, mut ap: ...) -> usize { + continue_if!(ap.arg::<c_int>() == 1); + continue_if!(ap.arg::<c_int>() == 2); + continue_if!(ap.arg::<c_int>() == 3); + continue_if!(ap.arg::<c_int>() == 4); + continue_if!(ap.arg::<c_int>() == 5); + continue_if!(ap.arg::<c_int>() == 6); + continue_if!(ap.arg::<c_int>() == 7); + continue_if!(ap.arg::<c_int>() == 8); + continue_if!(ap.arg::<c_int>() == 9); + continue_if!(ap.arg::<c_int>() == 10); + 0 +} + +#[no_mangle] +pub unsafe extern "C" fn check_varargs_4(_: c_double, mut ap: ...) -> usize { + continue_if!(ap.arg::<c_double>() == 1.0); + continue_if!(ap.arg::<c_double>() == 2.0); + continue_if!(ap.arg::<c_double>() == 3.0); + continue_if!(ap.arg::<c_double>() == 4.0); + continue_if!(ap.arg::<c_double>() == 5.0); + continue_if!(ap.arg::<c_double>() == 6.0); + continue_if!(ap.arg::<c_double>() == 7.0); + continue_if!(ap.arg::<c_double>() == 8.0); + continue_if!(ap.arg::<c_double>() == 9.0); + continue_if!(ap.arg::<c_double>() == 10.0); + 0 +} + +#[no_mangle] +pub unsafe extern "C" fn check_varargs_5(_: c_int, mut ap: ...) -> usize { + continue_if!(ap.arg::<c_double>() == 1.0); + continue_if!(ap.arg::<c_int>() == 1); + continue_if!(ap.arg::<c_double>() == 2.0); + continue_if!(ap.arg::<c_int>() == 2); + continue_if!(ap.arg::<c_double>() == 3.0); + continue_if!(ap.arg::<c_int>() == 3); + continue_if!(ap.arg::<c_double>() == 4.0); + continue_if!(ap.arg::<c_int>() == 4); + continue_if!(ap.arg::<c_int>() == 5); + continue_if!(ap.arg::<c_double>() == 5.0); + continue_if!(ap.arg::<c_int>() == 6); + continue_if!(ap.arg::<c_double>() == 6.0); + continue_if!(ap.arg::<c_int>() == 7); + continue_if!(ap.arg::<c_double>() == 7.0); + continue_if!(ap.arg::<c_int>() == 8); + continue_if!(ap.arg::<c_double>() == 8.0); + continue_if!(ap.arg::<c_int>() == 9); + continue_if!(ap.arg::<c_double>() == 9.0); + continue_if!(ap.arg::<c_int>() == 10); + continue_if!(ap.arg::<c_double>() == 10.0); + 0 +} diff --git a/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/test.c b/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/test.c index 91b060dce26..5bdb51680a6 100644 --- a/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/test.c +++ b/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/test.c @@ -11,6 +11,9 @@ extern size_t check_list_copy_0(va_list ap); extern size_t check_varargs_0(int fixed, ...); extern size_t check_varargs_1(int fixed, ...); extern size_t check_varargs_2(int fixed, ...); +extern size_t check_varargs_3(int fixed, ...); +extern size_t check_varargs_4(double fixed, ...); +extern size_t check_varargs_5(int fixed, ...); int test_rust(size_t (*fn)(va_list), ...) { size_t ret = 0; @@ -36,5 +39,12 @@ int main(int argc, char* argv[]) { assert(check_varargs_2(0, "All", "of", "these", "are", "ignored", ".") == 0); + assert(check_varargs_3(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) == 0); + + assert(check_varargs_4(0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0) == 0); + + assert(check_varargs_5(0, 1.0, 1, 2.0, 2, 3.0, 3, 4.0, 4, 5, 5.0, 6, 6.0, 7, 7.0, 8, 8.0, + 9, 9.0, 10, 10.0) == 0); + return 0; } |
