--- /dev/null
+use std::ops::Add;
+
+pub trait Encoder {
+ type Size: Add<Output = Self::Size>;
+
+ fn foo(&self) -> Self::Size;
+}
+
+pub trait SubEncoder: Encoder {
+ type ActualSize;
+
+ fn bar(&self) -> Self::Size;
+}
+
+impl<T> Encoder for T
+where
+ T: SubEncoder,
+{
+ type Size = <Self as SubEncoder>::ActualSize;
+ //~^ ERROR: cannot add `<T as SubEncoder>::ActualSize` to `<T as SubEncoder>::ActualSize`
+
+ fn foo(&self) -> Self::Size {
+ self.bar() + self.bar()
+ }
+}
+
+pub struct UnitEncoder;
+
+impl SubEncoder for UnitEncoder {
+ type ActualSize = ();
+
+ fn bar(&self) {}
+}
+
+pub fn fun<R: Encoder>(encoder: &R) {
+ encoder.foo();
+}
+
+fn main() {
+ fun(&UnitEncoder {});
+}
--- /dev/null
+error[E0277]: cannot add `<T as SubEncoder>::ActualSize` to `<T as SubEncoder>::ActualSize`
+ --> $DIR/issue-54108.rs:19:5
+ |
+LL | type Size: Add<Output = Self::Size>;
+ | ------------------------ required by this bound in `Encoder::Size`
+...
+LL | type Size = <Self as SubEncoder>::ActualSize;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `<T as SubEncoder>::ActualSize + <T as SubEncoder>::ActualSize`
+ |
+ = help: the trait `Add` is not implemented for `<T as SubEncoder>::ActualSize`
+help: consider further restricting the associated type
+ |
+LL | T: SubEncoder, <T as SubEncoder>::ActualSize: Add
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.