mirror of https://github.com/rust-lang/rust
389 lines
13 KiB
Rust
389 lines
13 KiB
Rust
#![allow(unused)]
|
|
#![deny(explicit_outlives_requirements)]
|
|
|
|
|
|
// These examples should live in edition-lint-infer-outlives.rs, but are split
|
|
// into this separate file because they can't be `rustfix`'d (and thus, can't
|
|
// be part of a `run-rustfix` test file) until rust-lang-nursery/rustfix#141
|
|
// is solved
|
|
|
|
mod structs {
|
|
use std::fmt::Debug;
|
|
|
|
struct TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
struct TeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where T: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
struct TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: T,
|
|
yoo: &'a &'b U
|
|
}
|
|
|
|
struct TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U> where U: 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: T,
|
|
yoo: &'a &'b U
|
|
}
|
|
|
|
struct TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U> where U: 'b + Debug {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U> where U: Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct TeeWhereOutlivesAyYooWhereBeeIsDebug<'a, 'b, T, U> where T: 'a, U: 'b + Debug {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct TeeWhereOutlivesAyYooWhereIsDebugBee<'a, 'b, T, U> where T: 'a, U: Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
struct BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T,
|
|
}
|
|
|
|
struct BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T,
|
|
}
|
|
|
|
struct BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
struct BeeWhereAyTeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where 'b: 'a, T: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
struct BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: T,
|
|
yoo: &'a &'b U
|
|
}
|
|
|
|
struct BeeWhereAyTeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U>
|
|
where U: 'a + Debug + 'b, 'b: 'a
|
|
//~^ ERROR outlives requirements can be inferred
|
|
{
|
|
tee: T,
|
|
yoo: &'a &'b U
|
|
}
|
|
}
|
|
|
|
mod tuple_structs {
|
|
use std::fmt::Debug;
|
|
|
|
struct TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b>(&'a &'b T);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeWhereOutlivesAyIsDebugBee<'a, 'b, T>(&'a &'b T) where T: 'a + Debug + 'b;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b>(T, &'a &'b U);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug>(&'a T, &'b U);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b>(&'a T, &'b U);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U>(&'a T, &'b U) where U: 'b;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U>(T, &'a &'b U) where U: 'a + Debug + 'b;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U>(&'a T, &'b U) where U: 'b + Debug;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U>(&'a T, &'b U) where U: Debug + 'b;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeWhereAyYooWhereBeeIsDebug<'a, 'b, T, U>(&'a T, &'b U) where T: 'a, U: 'b + Debug;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct TeeWhereAyYooWhereIsDebugBee<'a, 'b, T, U>(&'a T, &'b U) where T: 'a, U: Debug + 'b;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b>(&'a &'b T);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b>(&'a &'b T);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b>(&'a &'b T);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct BeeWhereAyTeeWhereAyIsDebugBee<'a, 'b, T>(&'a &'b T) where 'b: 'a, T: 'a + Debug + 'b;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b>(T, &'a &'b U);
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
struct BeeWhereAyTeeYooWhereAyIsDebugBee<'a, 'b, T, U>(T, &'a &'b U)
|
|
where U: 'a + Debug + 'b, 'b: 'a;
|
|
//~^ ERROR outlives requirements can be inferred
|
|
}
|
|
|
|
mod enums {
|
|
use std::fmt::Debug;
|
|
|
|
enum TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a &'b T },
|
|
}
|
|
|
|
enum TeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where T: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V(&'a &'b T),
|
|
}
|
|
|
|
enum TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: T, },
|
|
W(&'a &'b U),
|
|
}
|
|
|
|
enum TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a T, yoo: &'b U },
|
|
W,
|
|
}
|
|
|
|
enum TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V(&'a T, &'b U),
|
|
W,
|
|
}
|
|
|
|
enum TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U> where U: 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a T },
|
|
W(&'b U),
|
|
}
|
|
|
|
enum TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: T, yoo: &'a &'b U },
|
|
W,
|
|
}
|
|
|
|
enum TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U> where U: 'b + Debug {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V(&'a T, &'b U),
|
|
W,
|
|
}
|
|
|
|
enum TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U> where U: Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a T },
|
|
W(&'b U)
|
|
}
|
|
|
|
enum TeeWhereOutlivesAyYooWhereBeeIsDebug<'a, 'b, T, U> where T: 'a, U: 'b + Debug {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a T, yoo: &'b U },
|
|
W,
|
|
}
|
|
|
|
enum TeeWhereOutlivesAyYooWhereIsDebugBee<'a, 'b, T, U> where T: 'a, U: Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V(&'a T, &'b U),
|
|
W,
|
|
}
|
|
|
|
enum BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a &'b T },
|
|
}
|
|
|
|
enum BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a &'b T },
|
|
W,
|
|
}
|
|
|
|
enum BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: &'a &'b T },
|
|
}
|
|
|
|
enum BeeWhereAyTeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where 'b: 'a, T: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V(&'a &'b T),
|
|
}
|
|
|
|
enum BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: T },
|
|
W(&'a &'b U),
|
|
}
|
|
|
|
enum BeeWhereAyTeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b, 'b: 'a {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
V { tee: T, yoo: &'a &'b U },
|
|
}
|
|
}
|
|
|
|
mod unions {
|
|
use std::fmt::Debug;
|
|
|
|
union TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
union TeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where T: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
union TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: *const T,
|
|
yoo: &'a &'b U
|
|
}
|
|
|
|
union TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U> where U: 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: *const T,
|
|
yoo: &'a &'b U
|
|
}
|
|
|
|
union TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U> where U: 'b + Debug {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U> where U: Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union TeeWhereOutlivesAyYooWhereBeeIsDebug<'a, 'b, T, U> where T: 'a, U: 'b + Debug {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union TeeWhereOutlivesAyYooWhereIsDebugBee<'a, 'b, T, U> where T: 'a, U: Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a T,
|
|
yoo: &'b U
|
|
}
|
|
|
|
union BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T,
|
|
}
|
|
|
|
union BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T,
|
|
}
|
|
|
|
union BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
union BeeWhereAyTeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where 'b: 'a, T: 'a + Debug + 'b {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: &'a &'b T
|
|
}
|
|
|
|
union BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b> {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: *const T,
|
|
yoo: &'a &'b U
|
|
}
|
|
|
|
union BeeWhereAyTeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b, 'b: 'a {
|
|
//~^ ERROR outlives requirements can be inferred
|
|
tee: *const T,
|
|
yoo: &'a &'b U
|
|
}
|
|
}
|
|
|
|
// https://github.com/rust-lang/rust/issues/106870
|
|
mod multiple_predicates_with_same_span {
|
|
macro_rules! m {
|
|
($($name:ident)+) => {
|
|
struct Inline<'a, $($name: 'a,)+>(&'a ($($name,)+));
|
|
//~^ ERROR: outlives requirements can be inferred
|
|
struct FullWhere<'a, $($name,)+>(&'a ($($name,)+)) where $($name: 'a,)+;
|
|
//~^ ERROR: outlives requirements can be inferred
|
|
struct PartialWhere<'a, $($name,)+>(&'a ($($name,)+)) where (): Sized, $($name: 'a,)+;
|
|
//~^ ERROR: outlives requirements can be inferred
|
|
struct Interleaved<'a, $($name,)+>(&'a ($($name,)+))
|
|
where
|
|
(): Sized,
|
|
$($name: 'a, $name: 'a, )+ //~ ERROR: outlives requirements can be inferred
|
|
$($name: 'a, $name: 'a, )+;
|
|
}
|
|
}
|
|
m!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15);
|
|
}
|
|
|
|
fn main() {}
|