#![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() {}