153 lines
3.8 KiB
Rust
153 lines
3.8 KiB
Rust
// Make sure we honor region constraints when normalizing type annotations.
|
|
|
|
// check-fail
|
|
|
|
#![feature(more_qualified_paths)]
|
|
|
|
trait Trait {
|
|
type Assoc;
|
|
}
|
|
|
|
impl<T> Trait for T
|
|
where
|
|
T: 'static,
|
|
{
|
|
type Assoc = MyTy<()>;
|
|
}
|
|
|
|
enum MyTy<T> {
|
|
Unit,
|
|
Tuple(),
|
|
Struct {},
|
|
Dumb(T),
|
|
}
|
|
|
|
impl<T> MyTy<T> {
|
|
const CONST: () = ();
|
|
fn method<X>() {}
|
|
fn method2<X>(&self) {}
|
|
}
|
|
|
|
trait TraitAssoc {
|
|
const TRAIT_CONST: ();
|
|
fn trait_method<X>(&self);
|
|
}
|
|
impl<T> TraitAssoc for T {
|
|
const TRAIT_CONST: () = ();
|
|
fn trait_method<X>(&self) {}
|
|
}
|
|
|
|
type Ty<'a> = <&'a () as Trait>::Assoc;
|
|
|
|
fn test_local<'a>() {
|
|
let _: Ty<'a> = MyTy::Unit;
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_closure_sig<'a, 'b>() {
|
|
|_: Ty<'a>| {};
|
|
//~^ ERROR lifetime may not live long enough
|
|
|| -> Option<Ty<'b>> { None };
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_path<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h>() {
|
|
<Ty<'a>>::method::<Ty<'static>>;
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'static>>::method::<Ty<'b>>;
|
|
//~^ ERROR lifetime may not live long enough
|
|
|
|
<Ty<'c>>::trait_method::<Ty<'static>>;
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'static>>::trait_method::<Ty<'d>>;
|
|
//~^ ERROR lifetime may not live long enough
|
|
|
|
<Ty<'e>>::CONST;
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'f>>::TRAIT_CONST;
|
|
//~^ ERROR lifetime may not live long enough
|
|
|
|
<Ty<'static>>::method::<Ty<'static>>;
|
|
<Ty<'static>>::trait_method::<Ty<'static>>;
|
|
<Ty<'static>>::CONST;
|
|
<Ty<'static>>::TRAIT_CONST;
|
|
|
|
MyTy::Unit::<Ty<'g>>;
|
|
//~^ ERROR lifetime may not live long enough
|
|
MyTy::<Ty<'h>>::Unit;
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_call<'a, 'b, 'c>() {
|
|
<Ty<'a>>::method::<Ty<'static>>();
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'static>>::method::<Ty<'b>>();
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_variants<'a, 'b, 'c>() {
|
|
<Ty<'a>>::Struct {};
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'b>>::Tuple();
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'c>>::Unit;
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_method_call<'a, 'b>(x: MyTy<()>) {
|
|
x.method2::<Ty<'a>>();
|
|
//~^ ERROR lifetime may not live long enough
|
|
x.trait_method::<Ty<'b>>();
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_struct_path<'a, 'b, 'c, 'd>() {
|
|
struct Struct<T> { x: Option<T>, }
|
|
|
|
trait Project {
|
|
type Struct;
|
|
type Enum;
|
|
}
|
|
impl<T> Project for T {
|
|
type Struct = Struct<()>;
|
|
type Enum = MyTy<()>;
|
|
}
|
|
|
|
// Resolves to enum variant
|
|
MyTy::<Ty<'a>>::Struct {}; // without SelfTy
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'b> as Project>::Enum::Struct {}; // with SelfTy
|
|
//~^ ERROR lifetime may not live long enough
|
|
|
|
// Resolves to struct and associated type respectively
|
|
Struct::<Ty<'c>> { x: None, }; // without SelfTy
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'d> as Project>::Struct { x: None, }; // with SelfTy
|
|
//~^ ERROR lifetime may not live long enough
|
|
}
|
|
|
|
fn test_pattern<'a, 'b, 'c, 'd, 'e, 'f>() {
|
|
use MyTy::*;
|
|
match MyTy::Unit {
|
|
Struct::<Ty<'a>> {..} => {},
|
|
//~^ ERROR lifetime may not live long enough
|
|
Tuple::<Ty<'b>> (..) => {},
|
|
//~^ ERROR lifetime may not live long enough
|
|
Unit::<Ty<'c>> => {},
|
|
//~^ ERROR lifetime may not live long enough
|
|
Dumb(_) => {},
|
|
};
|
|
match MyTy::Unit {
|
|
<Ty<'d>>::Struct {..} => {},
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'e>>::Tuple (..) => {},
|
|
//~^ ERROR lifetime may not live long enough
|
|
<Ty<'f>>::Unit => {},
|
|
//~^ ERROR lifetime may not live long enough
|
|
Dumb(_) => {},
|
|
};
|
|
}
|
|
|
|
|
|
fn main() {}
|