38 lines
1.4 KiB
Rust
38 lines
1.4 KiB
Rust
#![crate_name = "foreign_lib"]
|
|
|
|
pub mod rustrt {
|
|
#[link(name = "rust_test_helpers", kind = "static")]
|
|
extern "C" {
|
|
pub fn rust_get_test_int() -> isize;
|
|
}
|
|
}
|
|
|
|
pub mod rustrt2 {
|
|
extern "C" {
|
|
pub fn rust_get_test_int() -> isize;
|
|
}
|
|
}
|
|
|
|
pub mod rustrt3 {
|
|
// The point of this test is to ensure that we don't ICE or trigger LLVM asserts when importing
|
|
// the same symbol with different types. This is not really possible to test portably; there is
|
|
// no different signature we can come up with that is different to LLVM but which for sure has
|
|
// the same behavior on all platforms. The signed-ness of integers is ignored by LLVM as well
|
|
// as pointee types. So the only ways to make our signatures differ are to use
|
|
// differently-sized integers which is definitely an ABI mismatch, or to rely on pointers and
|
|
// isize/usize having the same ABI, which is wrong on CHERI and probably other niche platforms.
|
|
// If this test causes you trouble, please file an issue.
|
|
// See https://github.com/rust-lang/rust/issues/32740 for the bug that prompted this test.
|
|
extern "C" {
|
|
pub fn rust_get_test_int() -> *const u8;
|
|
}
|
|
}
|
|
|
|
pub fn local_uses() {
|
|
unsafe {
|
|
let x = rustrt::rust_get_test_int();
|
|
assert_eq!(x, rustrt2::rust_get_test_int());
|
|
assert_eq!(x as *const u8, rustrt3::rust_get_test_int());
|
|
}
|
|
}
|