| // Check that we properly reconstruct sized bounds from the middle::ty IR to the surface syntax. | |
| #![crate_name = "it"] | |
| //@ aux-build: ext-sized-bounds.rs | |
| extern crate ext_sized_bounds as ext; | |
| // Ensure that we translate [<T as Sized>] to ``. | |
| // Non-`Self` type params are implicitly `Sized`, so we can hide it. | |
| // | |
| //@ has it/fn.sized_param.html | |
| //@ has - '//pre[@class="rust item-decl"]' "fn sized_param<T>()" | |
| //@ !has - '//pre[@class="rust item-decl"]' "T: Sized" | |
| pub use ext::sized_param; | |
| // Ensure that we translate [<T as MetaSized>] to `T: ?Sized`. | |
| // On stable, the user must've opted out of the implicit `Sized` bound using relaxed bound `?Sized` | |
| // which will implicitly add the `MetaSized` bound (which is unstable in the surface language). | |
| // | |
| //@ has it/fn.relaxed_sized_on_param.html | |
| //@ has - '//pre[@class="rust item-decl"]' "fn relaxed_sized_on_param<T>()where T: ?Sized" | |
| pub use ext::relaxed_sized_on_param; | |
| // Ensure that we don't drop the `T: Sized` bound on `func`. Previously, we didn't check if `T` | |
| // actually belongs to the closest item and thought that it was an implicit bound which it isn't. | |
| // issue: <https://github.com/rust-lang/rust/issues/144015> | |
| // | |
| //@ has it/trait.SizedOnParentParam.html | |
| //@ has - '//*[@class="rust item-decl"]' \ | |
| // "trait SizedOnParentParam<T>\ | |
| // where \ | |
| // T: ?Sized" | |
| //@ has - '//*[@id="tymethod.func"]' \ | |
| // "fn func()\ | |
| // where \ | |
| // T: Sized" | |
| pub use ext::SizedOnParentParam; | |
| // Ensure that we don't drop the `Self: Sized` bound on traits. | |
| // Traits are *not* implicitly bounded by `Sized`. They're only implicitly bounded by `MetaSized`. | |
| // | |
| //@ has it/trait.SizedSelf.html | |
| //@ has - '//*[@class="rust item-decl"]' 'trait SizedSelf: Sized {' | |
| pub use ext::SizedSelf; | |
| // Ensure that we don't drop the `Self: Sized` bound. | |
| // First of all, `Self` type params of traits are not implicitly bounded by `Self`. | |
| // Second of all, `Self` appears in a bound on an assoc item but `Self` belongs to the parent item, | |
| // the trait meaning it's definitely user-written and not implicit. | |
| // issue: <https://github.com/rust-lang/rust/issues/24183> | |
| // | |
| //@ has it/trait.SizedOnParentSelf.html | |
| //@ has - '//*[@class="rust item-decl"]' "trait SizedOnParentSelf {" | |
| //@ has - '//*[@id="method.func"]' \ | |
| // "fn func(self) -> Self\ | |
| // where \ | |
| // Self: Sized" | |
| pub use ext::SizedOnParentSelf; |