error[E0308]: mismatched types
  --> $DIR/missing-bounds.rs:11:11
   |
LL | impl<B> Add for A<B> where B: Add {
   |      - this type parameter
...
LL |         A(self.0 + rhs.0)
   |           ^^^^^^^^^^^^^^ expected type parameter `B`, found associated type
   |
   = note: expected type parameter `B`
             found associated type `<B as Add>::Output`
help: consider further restricting this bound
   |
LL | impl<B> Add for A<B> where B: Add + Add<Output = B> {
   |                                   +++++++++++++++++

error[E0308]: mismatched types
  --> $DIR/missing-bounds.rs:21:14
   |
LL | impl<B: Add> Add for C<B> {
   |      - this type parameter
...
LL |         Self(self.0 + rhs.0)
   |              ^^^^^^^^^^^^^^ expected type parameter `B`, found associated type
   |
   = note: expected type parameter `B`
             found associated type `<B as Add>::Output`
help: consider further restricting this bound
   |
LL | impl<B: Add + Add<Output = B>> Add for C<B> {
   |             +++++++++++++++++

error[E0369]: cannot add `B` to `B`
  --> $DIR/missing-bounds.rs:31:21
   |
LL |         Self(self.0 + rhs.0)
   |              ------ ^ ----- B
   |              |
   |              B
   |
help: consider restricting type parameter `B`
   |
LL | impl<B: std::ops::Add<Output = B>> Add for D<B> {
   |       +++++++++++++++++++++++++++

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0308, E0369.
For more information about an error, try `rustc --explain E0308`.
