122 lines
2.2 KiB
Rust
122 lines
2.2 KiB
Rust
//@ check-pass
|
|
//
|
|
// This tests checks that clashing_extern_declarations handles types that are recursive through a
|
|
// pointer or ref argument. See #75512.
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
mod raw_ptr_recursion {
|
|
mod a {
|
|
#[repr(C)]
|
|
struct Pointy {
|
|
pointy: *const Pointy,
|
|
}
|
|
|
|
extern "C" {
|
|
fn run_pointy(pointy: Pointy);
|
|
}
|
|
}
|
|
mod b {
|
|
#[repr(C)]
|
|
struct Pointy {
|
|
pointy: *const Pointy,
|
|
}
|
|
|
|
extern "C" {
|
|
fn run_pointy(pointy: Pointy);
|
|
}
|
|
}
|
|
}
|
|
|
|
mod raw_ptr_recursion_once_removed {
|
|
mod a {
|
|
#[repr(C)]
|
|
struct Pointy1 {
|
|
pointy_two: *const Pointy2,
|
|
}
|
|
|
|
#[repr(C)]
|
|
struct Pointy2 {
|
|
pointy_one: *const Pointy1,
|
|
}
|
|
|
|
extern "C" {
|
|
fn run_pointy2(pointy: Pointy2);
|
|
}
|
|
}
|
|
|
|
mod b {
|
|
#[repr(C)]
|
|
struct Pointy1 {
|
|
pointy_two: *const Pointy2,
|
|
}
|
|
|
|
#[repr(C)]
|
|
struct Pointy2 {
|
|
pointy_one: *const Pointy1,
|
|
}
|
|
|
|
extern "C" {
|
|
fn run_pointy2(pointy: Pointy2);
|
|
}
|
|
}
|
|
}
|
|
|
|
mod ref_recursion {
|
|
mod a {
|
|
#[repr(C)]
|
|
struct Reffy<'a> {
|
|
reffy: &'a Reffy<'a>,
|
|
}
|
|
|
|
extern "C" {
|
|
fn reffy_recursion(reffy: Reffy);
|
|
}
|
|
}
|
|
mod b {
|
|
#[repr(C)]
|
|
struct Reffy<'a> {
|
|
reffy: &'a Reffy<'a>,
|
|
}
|
|
|
|
extern "C" {
|
|
fn reffy_recursion(reffy: Reffy);
|
|
}
|
|
}
|
|
}
|
|
|
|
mod ref_recursion_once_removed {
|
|
mod a {
|
|
#[repr(C)]
|
|
struct Reffy1<'a> {
|
|
reffy: &'a Reffy2<'a>,
|
|
}
|
|
|
|
#[repr(C)]
|
|
struct Reffy2<'a> {
|
|
reffy: &'a Reffy1<'a>,
|
|
}
|
|
|
|
extern "C" {
|
|
#[allow(improper_ctypes)]
|
|
fn reffy_once_removed(reffy: Reffy1);
|
|
}
|
|
}
|
|
mod b {
|
|
#[repr(C)]
|
|
struct Reffy1<'a> {
|
|
reffy: &'a Reffy2<'a>,
|
|
}
|
|
|
|
#[repr(C)]
|
|
struct Reffy2<'a> {
|
|
reffy: &'a Reffy1<'a>,
|
|
}
|
|
|
|
extern "C" {
|
|
#[allow(improper_ctypes)]
|
|
fn reffy_once_removed(reffy: Reffy1);
|
|
}
|
|
}
|
|
}
|