summaryrefslogtreecommitdiffstats
path: root/src/test/ui/type/type-unsatisfiable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/type/type-unsatisfiable.rs')
-rw-r--r--src/test/ui/type/type-unsatisfiable.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/test/ui/type/type-unsatisfiable.rs b/src/test/ui/type/type-unsatisfiable.rs
new file mode 100644
index 000000000..7fbbb50dc
--- /dev/null
+++ b/src/test/ui/type/type-unsatisfiable.rs
@@ -0,0 +1,59 @@
+// revisions: lib usage
+//[lib] compile-flags: --crate-type=lib
+//[lib] build-pass
+
+use std::ops::Sub;
+trait Vector2 {
+ type ScalarType;
+
+ fn from_values(x: Self::ScalarType, y: Self::ScalarType) -> Self
+ where
+ Self: Sized;
+
+ fn x(&self) -> Self::ScalarType;
+ fn y(&self) -> Self::ScalarType;
+}
+
+impl<T> Sub for dyn Vector2<ScalarType = T>
+where
+ T: Sub<Output = T>,
+ (dyn Vector2<ScalarType = T>): Sized,
+{
+ type Output = dyn Vector2<ScalarType = T>;
+
+ fn sub(self, rhs: Self) -> Self::Output {
+ Self::from_values(self.x() - rhs.x(), self.y() - rhs.y())
+ }
+}
+
+struct Vec2 {
+ x: i32,
+ y: i32,
+}
+
+impl Vector2 for Vec2 {
+ type ScalarType = i32;
+
+ fn from_values(x: Self::ScalarType, y: Self::ScalarType) -> Self
+ where
+ Self: Sized,
+ {
+ Self { x, y }
+ }
+
+ fn x(&self) -> Self::ScalarType {
+ self.x
+ }
+ fn y(&self) -> Self::ScalarType {
+ self.y
+ }
+}
+
+#[cfg(usage)]
+fn main() {
+ let hey: Box<dyn Vector2<ScalarType = i32>> = Box::new(Vec2 { x: 1, y: 2 });
+ let word: Box<dyn Vector2<ScalarType = i32>> = Box::new(Vec2 { x: 1, y: 2 });
+
+ let bar = *hey - *word;
+ //[usage]~^ ERROR cannot subtract
+}