Add test demonstrating the issue.
This commit is contained in:
parent
8cdc94e840
commit
b0eb55a092
1 changed files with 117 additions and 0 deletions
117
src/test/ui/lint/clashing-extern-fn-recursion.rs
Normal file
117
src/test/ui/lint/clashing-extern-fn-recursion.rs
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
// 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 Reffy1<'a>,
|
||||
}
|
||||
|
||||
struct Reffy2<'a> {
|
||||
reffy: &'a Reffy2<'a>,
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
fn reffy_once_removed(reffy: Reffy1);
|
||||
}
|
||||
}
|
||||
mod b {
|
||||
#[repr(C)]
|
||||
struct Reffy1<'a> {
|
||||
reffy: &'a Reffy1<'a>,
|
||||
}
|
||||
|
||||
struct Reffy2<'a> {
|
||||
reffy: &'a Reffy2<'a>,
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
fn reffy_once_removed(reffy: Reffy1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue