/src/test/run-make-fulldeps/c-link-to-rust-va-list-fn/checkrust.rs

https://gitlab.com/rust-lang/rust · Rust · 148 lines · 134 code · 14 blank · 0 comment · 67 complexity · 415f89af5106d233c05ee7f2575319d2 MD5 · raw file

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