// run-pass
// Check that global bounds result in the expected choice of associated type

#![feature(trivial_bounds)]
#![allow(unused)]

struct B;

trait A {
    type X;
    fn get_x() -> Self::X;
}

impl A for B {
    type X = u8;
    fn get_x() -> u8 { 0 }
}

fn underspecified_bound() -> u8
where
    B: A //~ WARNING trivial_bounds
{
    B::get_x()
}

fn inconsistent_bound() -> i32
where
    B: A<X = i32> //~ WARNING trivial_bounds
{
    B::get_x()
}

fn redundant_bound() -> u8
where
    B: A<X = u8> //~ WARNING trivial_bounds
{
    B::get_x()
}

fn inconsistent_dup_bound() -> i32
where
    B: A<X = i32> + A
    //~^ WARNING trivial_bounds
    //~| WARNING trivial_bounds
{
    B::get_x()
}

fn redundant_dup_bound() -> u8
where
    B: A<X = u8> + A
    //~^ WARNING trivial_bounds
    //~| WARNING trivial_bounds
{
    B::get_x()
}

fn main () {}
