Rollup merge of #75554 - jumbatm:fix-clashing-extern-decl-overflow, r=lcnr
Fix clashing_extern_declarations stack overflow for recursive types. Fixes #75512. Adds a seen set to `structurally_same_type` to avoid recursing indefinitely for types which contain values of the same type through a pointer or reference.
This commit is contained in:
commit
e8d30bf542
2 changed files with 248 additions and 99 deletions
119
src/test/ui/lint/clashing-extern-fn-recursion.rs
Normal file
119
src/test/ui/lint/clashing-extern-fn-recursion.rs
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
// 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>,
|
||||
}
|
||||
|
||||
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>,
|
||||
}
|
||||
|
||||
struct Reffy2<'a> {
|
||||
reffy: &'a Reffy1<'a>,
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
#[allow(improper_ctypes)]
|
||||
fn reffy_once_removed(reffy: Reffy1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue