summaryrefslogtreecommitdiffstats
path: root/src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs')
-rw-r--r--src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs b/src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs
new file mode 100644
index 000000000..08f965452
--- /dev/null
+++ b/src/test/ui/associated-type-bounds/dyn-rpit-and-let.rs
@@ -0,0 +1,73 @@
+// run-pass
+
+// FIXME: uncomment let binding types below when `impl_trait_in_bindings` feature is fixed.
+
+#![feature(associated_type_bounds)]
+
+use std::ops::Add;
+
+trait Tr1 { type As1; fn mk(&self) -> Self::As1; }
+trait Tr2<'a> { fn tr2(self) -> &'a Self; }
+
+fn assert_copy<T: Copy>(x: T) { let _x = x; let _x = x; }
+fn assert_static<T: 'static>(_: T) {}
+fn assert_forall_tr2<T: for<'a> Tr2<'a>>(_: T) {}
+
+struct S1;
+#[derive(Copy, Clone)]
+struct S2;
+impl Tr1 for S1 { type As1 = S2; fn mk(&self) -> Self::As1 { S2 } }
+
+fn def_et1() -> Box<dyn Tr1<As1: Copy>> {
+ let x /* : Box<dyn Tr1<As1: Copy>> */ = Box::new(S1);
+ x
+}
+pub fn use_et1() { assert_copy(def_et1().mk()); }
+
+fn def_et2() -> Box<dyn Tr1<As1: Send + 'static>> {
+ let x /* : Box<dyn Tr1<As1: Send + 'static>> */ = Box::new(S1);
+ x
+}
+pub fn use_et2() { assert_static(def_et2().mk()); }
+
+fn def_et3() -> Box<dyn Tr1<As1: Clone + Iterator<Item: Add<u8, Output: Into<u8>>>>> {
+ struct A;
+ impl Tr1 for A {
+ type As1 = core::ops::Range<u8>;
+ fn mk(&self) -> Self::As1 { 0..10 }
+ }
+ let x /* : Box<dyn Tr1<As1: Clone + Iterator<Item: Add<u8, Output: Into<u8>>>>> */
+ = Box::new(A);
+ x
+}
+pub fn use_et3() {
+ let _0 = def_et3().mk().clone();
+ let mut s = 0u8;
+ for _1 in _0 {
+ let _2 = _1 + 1u8;
+ s += _2.into();
+ }
+ assert_eq!(s, (0..10).map(|x| x + 1).sum());
+}
+
+fn def_et4() -> Box<dyn Tr1<As1: for<'a> Tr2<'a>>> {
+ #[derive(Copy, Clone)]
+ struct A;
+ impl Tr1 for A {
+ type As1 = A;
+ fn mk(&self) -> A { A }
+ }
+ impl<'a> Tr2<'a> for A {
+ fn tr2(self) -> &'a Self { &A }
+ }
+ let x /* : Box<dyn Tr1<As1: for<'a> Tr2<'a>>> */ = Box::new(A);
+ x
+}
+pub fn use_et4() { assert_forall_tr2(def_et4().mk()); }
+
+fn main() {
+ let _ = use_et1();
+ let _ = use_et2();
+ let _ = use_et3();
+ let _ = use_et4();
+}