about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-10-29 12:08:56 +0900
committerGitHub <noreply@github.com>2020-10-29 12:08:56 +0900
commit572ea25e01142df147d94306b6deee5883c6a9dc (patch)
tree446b8cbdc7cb7281901e67ae712f9938031d1f0c
parent5e3cc6e913e5a0335c455179dd6be54fe84bb0c4 (diff)
parent22060fa0dc0f40652da875fd525e2a898c8584c5 (diff)
downloadrust-572ea25e01142df147d94306b6deee5883c6a9dc.tar.gz
rust-572ea25e01142df147d94306b6deee5883c6a9dc.zip
Rollup merge of #78478 - hameerabbasi:const-generics-supertraits, r=lcnr
Add const generics tests for supertraits + dyn traits.

Partially addresses #78433
-rw-r--r--src/test/ui/const-generics/dyn-supertraits.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/test/ui/const-generics/dyn-supertraits.rs b/src/test/ui/const-generics/dyn-supertraits.rs
new file mode 100644
index 00000000000..0295255d809
--- /dev/null
+++ b/src/test/ui/const-generics/dyn-supertraits.rs
@@ -0,0 +1,85 @@
+// run-pass
+// revisions: full min
+
+#![cfg_attr(full, feature(const_generics))]
+#![cfg_attr(full, allow(incomplete_features))]
+#![cfg_attr(min, feature(min_const_generics))]
+
+trait Foo<const N: usize> {
+    fn myfun(&self) -> usize;
+}
+trait Bar<const N: usize> : Foo<N> {}
+trait Baz: Foo<3> {}
+
+struct FooType<const N: usize>;
+struct BarType<const N: usize>;
+struct BazType;
+
+impl<const N: usize> Foo<N> for FooType<N> {
+    fn myfun(&self) -> usize { N }
+}
+impl<const N: usize> Foo<N> for BarType<N> {
+    fn myfun(&self) -> usize { N + 1 }
+}
+impl<const N: usize> Bar<N> for BarType<N> {}
+impl Foo<3> for BazType {
+    fn myfun(&self) -> usize { 999 }
+}
+impl Baz for BazType {}
+
+trait Foz {}
+trait Boz: Foo<3> + Foz {}
+trait Bok<const N: usize>: Foo<N> + Foz {}
+
+struct FozType;
+struct BozType;
+struct BokType<const N: usize>;
+
+impl Foz for FozType {}
+
+impl Foz for BozType {}
+impl Foo<3> for BozType {
+    fn myfun(&self) -> usize { 9999 }
+}
+impl Boz for BozType {}
+
+impl<const N: usize> Foz for BokType<N> {}
+impl<const N: usize> Foo<N> for BokType<N> {
+    fn myfun(&self) -> usize { N + 2 }
+}
+impl<const N: usize> Bok<N> for BokType<N> {}
+
+fn a<const N: usize>(x: &dyn Foo<N>) -> usize { x.myfun() }
+fn b(x: &dyn Foo<3>) -> usize { x.myfun() }
+fn c<T: Bok<N>, const N: usize>(x: T) -> usize { a::<N>(&x) }
+fn d<T: ?Sized + Foo<3>>(x: &T) -> usize { x.myfun() }
+fn e(x: &dyn Bar<3>) -> usize { d(x) }
+
+fn main() {
+    let foo = FooType::<3> {};
+    assert!(a(&foo) == 3);
+    assert!(b(&foo) == 3);
+    assert!(d(&foo) == 3);
+
+    let bar = BarType::<3> {};
+    assert!(a(&bar) == 4);
+    assert!(b(&bar) == 4);
+    assert!(d(&bar) == 4);
+    assert!(e(&bar) == 4);
+
+    let baz = BazType {};
+    assert!(a(&baz) == 999);
+    assert!(b(&baz) == 999);
+    assert!(d(&baz) == 999);
+
+    let boz = BozType {};
+    assert!(a(&boz) == 9999);
+    assert!(b(&boz) == 9999);
+    assert!(d(&boz) == 9999);
+
+    let bok = BokType::<3> {};
+    assert!(a(&bok) == 5);
+    assert!(b(&bok) == 5);
+    assert!(d(&bok) == 5);
+    assert!(c(BokType::<3> {}) == 5);
+}