// Unit test for the "user substitutions" that are annotated on each
// node.

//@ compile-flags:-Zverbose-internals

#![feature(rustc_attrs)]

// Note: we reference the names T and U in the comments below.
trait Bazoom<T> {
    fn method<U>(&self, arg: T, arg2: U) {}
}

impl<S, T> Bazoom<T> for S {}

fn foo<'a, T>(_: T) {}

#[rustc_dump_user_args]
fn main() {
    // Here: nothing is given, so we don't have any annotation.
    let x = foo;
    x(22);

    // Here: `u32` is given, which doesn't contain any lifetimes, so we don't
    // have any annotation.
    let x = foo::<u32>;
    x(22);

    let x = foo::<&'static u32>; //~ ERROR [&'static u32]
    x(&22);

    // Here: we only want the `T` to be given, the rest should be variables.
    //
    // (`T` refers to the declaration of `Bazoom`)
    let x = <_ as Bazoom<u32>>::method::<_>; //~ ERROR [^c_0, u32, ^c_1]
    x(&22, 44, 66);

    // Here: all are given and definitely contain no lifetimes, so we
    // don't have any annotation.
    let x = <u8 as Bazoom<u16>>::method::<u32>;
    x(&22, 44, 66);

    // Here: all are given and we have a lifetime.
    let x = <u8 as Bazoom<&'static u16>>::method::<u32>; //~ ERROR [u8, &'static u16, u32]
    x(&22, &44, 66);

    // Here: we want in particular that *only* the method `U`
    // annotation is given, the rest are variables.
    //
    // (`U` refers to the declaration of `Bazoom`)
    let y = 22_u32;
    y.method::<u32>(44, 66); //~ ERROR [^c_0, ^c_1, u32]

    // Here: nothing is given, so we don't have any annotation.
    let y = 22_u32;
    y.method(44, 66);
}
