// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// Test that we can derive lifetime bounds on `Self` from trait
// inheritance.

trait Static : 'static { }

trait Is<'a> : 'a { }

struct Inv<'a> {
    x: Option<&'a mut &'a isize>
}

fn check_bound<'a,A:'a>(x: Inv<'a>, a: A) { }

// In these case, `Self` inherits `'static`.

trait InheritsFromStatic : Sized + 'static {
    fn foo1<'a>(self, x: Inv<'a>) {
        check_bound(x, self)
    }
}
trait InheritsFromStaticIndirectly : Sized + Static {
    fn foo1<'a>(self, x: Inv<'a>) {
        check_bound(x, self)
    }
}


// In these case, `Self` inherits `'a`.

trait InheritsFromIs<'a> : Sized + 'a {
    fn foo(self, x: Inv<'a>) {
        check_bound(x, self)
    }
}

trait InheritsFromIsIndirectly<'a> : Sized + Is<'a> {
    fn foo(self, x: Inv<'a>) {
        check_bound(x, self)
    }
}

// In this case, `Self` inherits nothing.

trait InheritsFromNothing<'a> : Sized {
    fn foo(self, x: Inv<'a>) {
        check_bound(x, self)
            //~^ ERROR parameter type `Self` may not live long enough
    }
}

fn main() { }
