Skip to content

Commit

Permalink
Add more test cases for cyclic trait sealing. (#773) (#774)
Browse files Browse the repository at this point in the history
  • Loading branch information
obi1kenobi authored Feb 17, 2025
1 parent 0f0a47a commit 6d7b429
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 0 deletions.
55 changes: 55 additions & 0 deletions src/adapter/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -658,6 +658,38 @@ fn rustdoc_sealed_traits() {
sealed: true,
public_api_sealed: true,
},
Output {
name: "NonRefRecursiveSealed".into(),
path: vec![],
sealed: true,
public_api_sealed: true,
},
Output {
name: "NonRefSealedPlusRecursiveBlanket".into(),
path: vec![vec![
"sealed_traits".into(),
"cyclic_bounds2".into(),
"NonRefSealedPlusRecursiveBlanket".into(),
]],
sealed: true,
public_api_sealed: true,
},
Output {
name: "DirectCycleSuper".into(),
path: vec![],
sealed: true,
public_api_sealed: true,
},
Output {
name: "DirectCycleSub".into(),
path: vec![vec![
"sealed_traits".into(),
"direct_cycle".into(),
"DirectCycleSub".into(),
]],
sealed: true,
public_api_sealed: true,
},
Output {
name: "HiddenSealed".into(),
path: vec![vec![
Expand Down Expand Up @@ -1173,6 +1205,29 @@ fn rustdoc_sealed_traits() {
sealed: false,
public_api_sealed: false,
},
Output {
name: "DirectCycleSuper".into(),
path: vec![vec![
"sealed_traits".into(),
"doc_hidden".into(),
"direct_cycle".into(),
"hidden".into(),
"DirectCycleSuper".into(),
]],
sealed: false,
public_api_sealed: true,
},
Output {
name: "DirectCycleSub".into(),
path: vec![vec![
"sealed_traits".into(),
"doc_hidden".into(),
"direct_cycle".into(),
"DirectCycleSub".into(),
]],
sealed: false,
public_api_sealed: true,
},
];
expected_results.sort_unstable();

Expand Down
14 changes: 14 additions & 0 deletions test_crates/sealed_traits/src/doc_hidden.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,3 +301,17 @@ pub trait DeprecatedMethod {
pub trait MethodDeprecatedArgType {
fn method(&self, token: hidden_module::DeprecatedToken);
}

/// A direct case of two traits declaring blankets on each other.
pub mod direct_cycle {
pub mod hidden {
#[doc(hidden)]
pub trait DirectCycleSuper {}
}

pub trait DirectCycleSub: hidden::DirectCycleSuper {}

impl<T: DirectCycleSub> hidden::DirectCycleSuper for T {}

impl<T: hidden::DirectCycleSuper> DirectCycleSub for T {}
}
39 changes: 39 additions & 0 deletions test_crates/sealed_traits/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -380,3 +380,42 @@ pub mod cyclic_bounds {

impl<T: SealedPlusRecursiveBlanket> SealedPlusRecursiveBlanket for &T {}
}

/// Another variation of the above idea.
/// In this one, we use `T` instead of `&T` which also suprisingly compiles.
pub mod cyclic_bounds2 {
mod recursive {
pub trait NonRefRecursiveSealed {}

impl<T: super::NonRefSealedPlusRecursiveBlanket> NonRefRecursiveSealed for T {}
}

/// This is sealed, here's proof:
/// ```compile_fail
/// struct Example;
///
/// impl sealed_traits::cyclic_bounds2::NonRefSealedPlusRecursiveBlanket for Example {}
/// ```
pub trait NonRefSealedPlusRecursiveBlanket: recursive::NonRefRecursiveSealed {}

impl<T: NonRefSealedPlusRecursiveBlanket> NonRefSealedPlusRecursiveBlanket for T {}
}

/// A direct case of two traits declaring blankets on each other.
pub mod direct_cycle {
mod private {
pub trait DirectCycleSuper {}
}

/// This is sealed here's proof:
/// ```compile_fail
/// struct Example;
///
/// impl sealed_traits::direct_cycle::DirectCycleSub for Example {}
/// ```
pub trait DirectCycleSub: private::DirectCycleSuper {}

impl<T: DirectCycleSub> private::DirectCycleSuper for T {}

impl<T: private::DirectCycleSuper> DirectCycleSub for T {}
}

0 comments on commit 6d7b429

Please sign in to comment.