diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2021-01-28 15:09:15 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-28 15:09:15 +0900 |
| commit | f183e5f04c0576ec4dedefe3c7caaafaade3f267 (patch) | |
| tree | f5528bad7e5c62449f93b3a8a270244dfb9c209a /src/test | |
| parent | b8eac50ff59fb67ee3338f0e90b9c21058c96a1a (diff) | |
| parent | ab421a176240a658ed02e8eee70b7ea211c087e3 (diff) | |
| download | rust-f183e5f04c0576ec4dedefe3c7caaafaade3f267.tar.gz rust-f183e5f04c0576ec4dedefe3c7caaafaade3f267.zip | |
Rollup merge of #81426 - BoxyUwU:boxychangesv2, r=oli-obk
const_evaluatable: expand abstract consts in try_unify See this [zulip topic](https://rust-lang.zulipchat.com/#narrow/stream/260443-project-const-generics/topic/combining.20const.20bounds) for more info cc ```@lcnr``` r? ```@oli-obk```
Diffstat (limited to 'src/test')
4 files changed, 123 insertions, 0 deletions
diff --git a/src/test/ui/const-generics/const_evaluatable_checked/nested-abstract-consts-1.rs b/src/test/ui/const-generics/const_evaluatable_checked/nested-abstract-consts-1.rs new file mode 100644 index 00000000000..0fe84c1cd2a --- /dev/null +++ b/src/test/ui/const-generics/const_evaluatable_checked/nested-abstract-consts-1.rs @@ -0,0 +1,24 @@ +// run-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +fn callee<const M2: usize>() -> usize +where + [u8; M2 + 1]: Sized, +{ + M2 +} + +fn caller<const N1: usize>() -> usize +where + [u8; N1 + 1]: Sized, + [u8; (N1 + 1) + 1]: Sized, +{ + callee::<{ N1 + 1 }>() +} + +fn main() { + assert_eq!(caller::<4>(), 5); +} + +// Test that the ``(N1 + 1) + 1`` bound on ``caller`` satisfies the ``M2 + 1`` bound on ``callee`` diff --git a/src/test/ui/const-generics/const_evaluatable_checked/nested-abstract-consts-2.rs b/src/test/ui/const-generics/const_evaluatable_checked/nested-abstract-consts-2.rs new file mode 100644 index 00000000000..4f588238e23 --- /dev/null +++ b/src/test/ui/const-generics/const_evaluatable_checked/nested-abstract-consts-2.rs @@ -0,0 +1,35 @@ +// run-pass +#![feature(const_evaluatable_checked, const_generics)] +#![allow(incomplete_features)] + +struct Generic<const K: u64>; + +struct ConstU64<const K: u64>; + +impl<const K: u64> Generic<K> +where + ConstU64<{ K - 1 }>: , +{ + fn foo(self) -> u64 { + K + } +} + +impl<const K: u64> Generic<K> +where + ConstU64<{ K - 1 }>: , + ConstU64<{ K + 1 }>: , + ConstU64<{ K + 1 - 1 }>: , +{ + fn bar(self) -> u64 { + let x: Generic<{ K + 1 }> = Generic; + x.foo() + } +} + +fn main() { + assert_eq!((Generic::<10>).bar(), 11); +} + +// Test that the ``ConstU64<{ K + 1 - 1}>`` bound on ``bar``'s impl block satisfies the +// ``ConstU64<{K - 1}>`` bound on ``foo``'s impl block diff --git a/src/test/ui/const-generics/const_evaluatable_checked/nested_uneval_unification-1.rs b/src/test/ui/const-generics/const_evaluatable_checked/nested_uneval_unification-1.rs new file mode 100644 index 00000000000..1428f774b0d --- /dev/null +++ b/src/test/ui/const-generics/const_evaluatable_checked/nested_uneval_unification-1.rs @@ -0,0 +1,35 @@ +// run-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +fn zero_init<const N: usize>() -> Substs1<N> +where + [u8; N + 1]: , +{ + Substs1([0; N + 1]) +} +struct Substs1<const N: usize>([u8; N + 1]) +where + [(); N + 1]: ; + +fn substs2<const M: usize>() -> Substs1<{ M * 2 }> +where + [(); { M * 2 } + 1]: , +{ + zero_init::<{ M * 2 }>() +} + +fn substs3<const L: usize>() -> Substs1<{ (L - 1) * 2 }> +where + [(); (L - 1)]: , + [(); (L - 1) * 2 + 1]: , +{ + substs2::<{ L - 1 }>() +} + +fn main() { + assert_eq!(substs3::<2>().0, [0; 3]); +} + +// Test that the ``{ (L - 1) * 2 + 1 }`` bound on ``substs3`` satisfies the +// ``{ N + 1 }`` bound on ``Substs1`` diff --git a/src/test/ui/const-generics/const_evaluatable_checked/nested_uneval_unification-2.rs b/src/test/ui/const-generics/const_evaluatable_checked/nested_uneval_unification-2.rs new file mode 100644 index 00000000000..be8219a7446 --- /dev/null +++ b/src/test/ui/const-generics/const_evaluatable_checked/nested_uneval_unification-2.rs @@ -0,0 +1,29 @@ +// run-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features, unused_parens, unused_braces)] + +fn zero_init<const N: usize>() -> Substs1<{ (N) }> +where + [u8; { (N) }]: , +{ + Substs1([0; { (N) }]) +} + +struct Substs1<const N: usize>([u8; { (N) }]) +where + [(); { (N) }]: ; + +fn substs2<const M: usize>() -> Substs1<{ (M) }> { + zero_init::<{ (M) }>() +} + +fn substs3<const L: usize>() -> Substs1<{ (L) }> { + substs2::<{ (L) }>() +} + +fn main() { + assert_eq!(substs3::<2>().0, [0; 2]); +} + +// Test that the implicit ``{ (L) }`` bound on ``substs3`` satisfies the +// ``{ (N) }`` bound on ``Substs1`` |
