Don't declare test_variadic_fnptr with two conflicting signatures
It is UB for LLVM and results in a compile error for Cranelift
This commit is contained in:
parent
4767ccec93
commit
56939ffe7d
@ -30,25 +30,5 @@ index 0000000..46fd999
|
||||
+
|
||||
+[dependencies]
|
||||
+rand = "0.7"
|
||||
diff --git a/library/core/tests/ptr.rs b/library/core/tests/ptr.rs
|
||||
index 1a6be3a..42dbd59 100644
|
||||
--- a/library/core/tests/ptr.rs
|
||||
+++ b/library/core/tests/ptr.rs
|
||||
@@ -250,6 +250,7 @@ fn test_unsized_nonnull() {
|
||||
};
|
||||
}
|
||||
|
||||
+/*
|
||||
#[test]
|
||||
#[allow(warnings)]
|
||||
// Have a symbol for the test below. It doesn’t need to be an actual variadic function, match the
|
||||
@@ -277,6 +277,7 @@ pub fn test_variadic_fnptr() {
|
||||
let mut s = SipHasher::new();
|
||||
assert_eq!(p.hash(&mut s), q.hash(&mut s));
|
||||
}
|
||||
+*/
|
||||
|
||||
#[test]
|
||||
fn write_unaligned_drop() {
|
||||
--
|
||||
2.21.0 (Apple Git-122)
|
||||
|
@ -23,6 +23,7 @@
|
||||
#![feature(const_ptr_offset)]
|
||||
#![feature(const_trait_impl)]
|
||||
#![feature(const_likely)]
|
||||
#![feature(core_ffi_c)]
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(core_private_bignum)]
|
||||
#![feature(core_private_diy_float)]
|
||||
|
@ -289,16 +289,18 @@ fn test_const_nonnull_new() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(warnings)]
|
||||
// Have a symbol for the test below. It doesn’t need to be an actual variadic function, match the
|
||||
// ABI, or even point to an actual executable code, because the function itself is never invoked.
|
||||
#[no_mangle]
|
||||
#[cfg(any(unix, windows))] // printf may not be available on other platforms
|
||||
#[allow(deprecated)] // For SipHasher
|
||||
pub fn test_variadic_fnptr() {
|
||||
use core::ffi;
|
||||
use core::hash::{Hash, SipHasher};
|
||||
extern "C" {
|
||||
fn test_variadic_fnptr(_: u64, ...) -> f64;
|
||||
// This needs to use the correct function signature even though it isn't called as some
|
||||
// codegen backends make it UB to declare a function with multiple conflicting signatures
|
||||
// (like LLVM) while others straight up return an error (like Cranelift).
|
||||
fn printf(_: *const ffi::c_char, ...) -> ffi::c_int;
|
||||
}
|
||||
let p: unsafe extern "C" fn(u64, ...) -> f64 = test_variadic_fnptr;
|
||||
let p: unsafe extern "C" fn(*const ffi::c_char, ...) -> ffi::c_int = printf;
|
||||
let q = p.clone();
|
||||
assert_eq!(p, q);
|
||||
assert!(!(p < q));
|
||||
|
Loading…
Reference in New Issue
Block a user