// Test traits

trait Foo {
    fn bar(x: i32   ) -> Baz<   U> {       Baz::new()
  }

    fn baz(a: AAAAAAAAAAAAAAAAAAAAAA,
b: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB)
-> RetType;

    fn foo(a: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, // Another comment
b: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB)
           -> RetType              ; // Some comment

    fn baz(&mut self        ) -> i32          ;

fn increment(&     mut self, x: i32         );

    fn read(&mut self,          x: BufReader<R> /* Used to be MemReader */)
    where R: Read;
}

pub trait WriteMessage {
    fn write_message  (&mut self, &FrontendMessage) ->   io::Result<()>;
}

trait Runnable {
    fn handler(self: & Runnable   );
}

trait TraitWithExpr {
    fn fn_with_expr(x: [i32;       1]);
}

trait Test {
    fn read_struct<T, F>(&mut self, s_name: &str, len: usize, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>;
}

trait T<> {}

trait Foo { type Bar: Baz; type Inner: Foo   = Box< Foo >; }

trait ConstCheck<T>:Foo   where   T: Baz { 
        const   J:   i32;
}

trait Tttttttttttttttttttttttttttttttttttttttttttttttttttttttttt<T> 
    where T: Foo {}

trait Ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt<T> where T: Foo {}

trait FooBar<T> : Tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt where J: Bar { fn test(); }

trait WhereList<T, J> where T: Foo, J: Bar {}

trait X /* comment */ {}
trait Y // comment
{
}

// #2055
pub trait Foo:
// A and C
A + C
// and B
    + B
{}

// #2158
trait Foo {
    type ItRev = <MergingUntypedTimeSeries<SliceSeries<SliceWindow>> as UntypedTimeSeries>::IterRev;
    type IteRev = <MergingUntypedTimeSeries<SliceSeries<SliceWindow>> as UntypedTimeSeries>::IterRev;
}

// #2331
trait MyTrait<AAAAAAAAAAAAAAAAAAAA, BBBBBBBBBBBBBBBBBBBB, CCCCCCCCCCCCCCCCCCCC, DDDDDDDDDDDDDDDDDDDD> {
    fn foo() {}
}

// Trait aliases
trait FooBar =
    Foo 
    + Bar;
trait FooBar <A, B, C>=
    Foo 
    + Bar;
pub trait FooBar =
    Foo 
    + Bar;
pub trait FooBar <A, B, C>=
    Foo 
    + Bar;
trait AAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
pub trait AAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
trait AAAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDD;
trait AAAAAAAAAAAAAAAAAA = BBBBBBBBBBBBBBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCC + DDDDDDDDDDDDDDDDDDD;
trait AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<A, B, C, D, E> = FooBar;
trait AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<A, B, C, D, E> = FooBar;
#[rustfmt::skip]
trait FooBar = Foo
    + Bar;

// #2637
auto trait Example {}
pub auto trait PubExample {}
pub unsafe auto trait PubUnsafeExample {}

// #3006
trait Foo<'a> {
    type Bar<  'a  >;
}

impl<'a> Foo<'a> for i32 {
    type Bar<  'a  > = i32;
}

// #3092
pub mod test {
    pub trait ATraitWithALooongName {}
    pub trait ATrait
        :ATraitWithALooongName + ATraitWithALooongName + ATraitWithALooongName + ATraitWithALooongName
{
}
}

// Trait aliases with where clauses.
trait A = where for<'b> &'b Self: Send;

trait B = where for<'b> &'b Self: Send + Clone + Copy + SomeTrait + AAAAAAAA + BBBBBBB + CCCCCCCCCC;
trait B = where for<'b> &'b Self: Send + Clone + Copy + SomeTrait + AAAAAAAA + BBBBBBB + CCCCCCCCCCC;
trait B = where
    for<'b> &'b Self:
Send + Clone + Copy + SomeTrait + AAAAAAAA + BBBBBBB + CCCCCCCCCCCCCCCCCCCCCCC;
trait B = where
    for<'b> &'b Self:
Send + Clone + Copy + SomeTrait + AAAAAAAA + BBBBBBB + CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;

trait B = where
    for<'b> &'b Self:
Send
    + Clone
    + Copy
    + SomeTrait
    + AAAAAAAA
    + BBBBBBB
    + CCCCCCCCC
    + DDDDDDD
    + DDDDDDDD
    + DDDDDDDDD
    + EEEEEEE;

trait A<'a, 'b, 'c> = Debug<T> + Foo where for<'b> &'b Self: Send;

trait B<'a, 'b, 'c> = Debug<T> +Foo
where for<'b> &'b Self:
Send
    + Clone
    + Copy
    + SomeTrait
    + AAAAAAAA
    + BBBBBBB
    + CCCCCCCCC
    + DDDDDDD;

trait B<'a, 'b, 'c,T> = Debug<'a, T> where for<'b> &'b Self:
Send
    + Clone
    + Copy
    + SomeTrait
    + AAAAAAAA
    + BBBBBBB
    + CCCCCCCCC
    + DDDDDDD
    + DDDDDDDD
    + DDDDDDDDD
    + EEEEEEE;

trait Visible {
    pub const C: i32;
    pub type T;
    pub fn f();
    pub fn g() {}
}

const trait Foomp = Hash;