From ebc1f89ecf3a8de6da0ed6c5809586105f5d7fae Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Fri, 9 Oct 2020 18:32:22 +0900 Subject: [PATCH] Add a regression test for issue-54108 --- src/test/ui/associated-types/issue-54108.rs | 41 +++++++++++++++++++ .../ui/associated-types/issue-54108.stderr | 18 ++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/test/ui/associated-types/issue-54108.rs create mode 100644 src/test/ui/associated-types/issue-54108.stderr diff --git a/src/test/ui/associated-types/issue-54108.rs b/src/test/ui/associated-types/issue-54108.rs new file mode 100644 index 000000000000..87f67ce4b527 --- /dev/null +++ b/src/test/ui/associated-types/issue-54108.rs @@ -0,0 +1,41 @@ +use std::ops::Add; + +pub trait Encoder { + type Size: Add; + + fn foo(&self) -> Self::Size; +} + +pub trait SubEncoder: Encoder { + type ActualSize; + + fn bar(&self) -> Self::Size; +} + +impl Encoder for T +where + T: SubEncoder, +{ + type Size = ::ActualSize; + //~^ ERROR: cannot add `::ActualSize` to `::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(encoder: &R) { + encoder.foo(); +} + +fn main() { + fun(&UnitEncoder {}); +} diff --git a/src/test/ui/associated-types/issue-54108.stderr b/src/test/ui/associated-types/issue-54108.stderr new file mode 100644 index 000000000000..927a2de99656 --- /dev/null +++ b/src/test/ui/associated-types/issue-54108.stderr @@ -0,0 +1,18 @@ +error[E0277]: cannot add `::ActualSize` to `::ActualSize` + --> $DIR/issue-54108.rs:19:5 + | +LL | type Size: Add; + | ------------------------ required by this bound in `Encoder::Size` +... +LL | type Size = ::ActualSize; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `::ActualSize + ::ActualSize` + | + = help: the trait `Add` is not implemented for `::ActualSize` +help: consider further restricting the associated type + | +LL | T: SubEncoder, ::ActualSize: Add + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`.