//@ 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); } } }