diff options
| author | Ryan Levick <rylev@users.noreply.github.com> | 2021-09-06 12:38:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-06 12:38:53 +0200 |
| commit | dcd0e1d835c16e41dab49037e7887cb80d746aef (patch) | |
| tree | c65ca654a8e50e7c63e9fd8b605d4a38e5528ee8 | |
| parent | b2d9bcda7ec267dbabfaef67f7af344ef71e002c (diff) | |
| parent | 89c6d4f9886b068f50b286eedbd503ff285f4b38 (diff) | |
| download | rust-dcd0e1d835c16e41dab49037e7887cb80d746aef.tar.gz rust-dcd0e1d835c16e41dab49037e7887cb80d746aef.zip | |
Rollup merge of #88602 - BoxyUwU:tests-uwu-nya, r=lcnr
Add tests for some const generics issues closes #82956 closes #84659 closes #86530 closes #86535 there is also a random test in here about array repeat expressions that I already had on this branch but it seems to fit the theme of this PR so kept it... r? `@lcnr`
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-82956.rs | 33 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-82956.stderr | 21 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-84659.rs | 12 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-84659.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-86530.rs | 20 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-86530.stderr | 18 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-86535-2.rs | 19 | ||||
| -rw-r--r-- | src/test/ui/const-generics/issues/issue-86535.rs | 20 | ||||
| -rw-r--r-- | src/test/ui/const-generics/sneaky-array-repeat-expr.rs | 32 | ||||
| -rw-r--r-- | src/test/ui/const-generics/sneaky-array-repeat-expr.stderr | 18 |
10 files changed, 203 insertions, 0 deletions
diff --git a/src/test/ui/const-generics/issues/issue-82956.rs b/src/test/ui/const-generics/issues/issue-82956.rs new file mode 100644 index 00000000000..a3a0d8d06e8 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-82956.rs @@ -0,0 +1,33 @@ +#![feature(generic_const_exprs, array_map)] +#![allow(incomplete_features)] + +pub struct ConstCheck<const CHECK: bool>; + +pub trait True {} +impl True for ConstCheck<true> {} + +pub trait OrdesDec { + type Newlen; + type Output; + + fn pop(self) -> (Self::Newlen, Self::Output); +} + +impl<T, const N: usize> OrdesDec for [T; N] +where + ConstCheck<{N > 1}>: True, + [T; N - 1]: Sized, +{ + type Newlen = [T; N - 1]; + type Output = T; + + fn pop(self) -> (Self::Newlen, Self::Output) { + let mut iter = IntoIter::new(self); + //~^ ERROR: failed to resolve: use of undeclared type `IntoIter` + let end = iter.next_back().unwrap(); + let new = [(); N - 1].map(move |()| iter.next().unwrap()); + (new, end) + } +} + +fn main() {} diff --git a/src/test/ui/const-generics/issues/issue-82956.stderr b/src/test/ui/const-generics/issues/issue-82956.stderr new file mode 100644 index 00000000000..c8b999da981 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-82956.stderr @@ -0,0 +1,21 @@ +error[E0433]: failed to resolve: use of undeclared type `IntoIter` + --> $DIR/issue-82956.rs:25:24 + | +LL | let mut iter = IntoIter::new(self); + | ^^^^^^^^ not found in this scope + | +help: consider importing one of these items + | +LL | use std::array::IntoIter; + | +LL | use std::collections::binary_heap::IntoIter; + | +LL | use std::collections::btree_map::IntoIter; + | +LL | use std::collections::btree_set::IntoIter; + | + and 8 other candidates + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0433`. diff --git a/src/test/ui/const-generics/issues/issue-84659.rs b/src/test/ui/const-generics/issues/issue-84659.rs new file mode 100644 index 00000000000..440ca740af2 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-84659.rs @@ -0,0 +1,12 @@ +#![allow(incomplete_features)] +#![feature(generic_const_exprs)] + +trait Bar<const N: usize> {} + +trait Foo<'a> { + const N: usize; + type Baz: Bar<{ Self::N }>; + //~^ ERROR: unconstrained generic constant +} + +fn main() {} diff --git a/src/test/ui/const-generics/issues/issue-84659.stderr b/src/test/ui/const-generics/issues/issue-84659.stderr new file mode 100644 index 00000000000..2dfc48a34e4 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-84659.stderr @@ -0,0 +1,10 @@ +error: unconstrained generic constant + --> $DIR/issue-84659.rs:8:15 + | +LL | type Baz: Bar<{ Self::N }>; + | ^^^^^^^^^^^^^^^^ + | + = help: try adding a `where` bound using this expression: `where [(); { Self::N }]:` + +error: aborting due to previous error + diff --git a/src/test/ui/const-generics/issues/issue-86530.rs b/src/test/ui/const-generics/issues/issue-86530.rs new file mode 100644 index 00000000000..b024decd4e1 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-86530.rs @@ -0,0 +1,20 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] + +pub trait X { + const Y: usize; +} + +fn z<T>(t: T) +where + T: X, + [(); T::Y]: , +{ +} + +fn unit_literals() { + z(" "); + //~^ ERROR: the trait bound `&str: X` is not satisfied +} + +fn main() {} diff --git a/src/test/ui/const-generics/issues/issue-86530.stderr b/src/test/ui/const-generics/issues/issue-86530.stderr new file mode 100644 index 00000000000..7cdfc9dfcdf --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-86530.stderr @@ -0,0 +1,18 @@ +error[E0277]: the trait bound `&str: X` is not satisfied + --> $DIR/issue-86530.rs:16:7 + | +LL | z(" "); + | ^^^ the trait `X` is not implemented for `&str` + | +note: required by a bound in `z` + --> $DIR/issue-86530.rs:10:8 + | +LL | fn z<T>(t: T) + | - required by a bound in this +LL | where +LL | T: X, + | ^ required by this bound in `z` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/const-generics/issues/issue-86535-2.rs b/src/test/ui/const-generics/issues/issue-86535-2.rs new file mode 100644 index 00000000000..0b535fd6649 --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-86535-2.rs @@ -0,0 +1,19 @@ +// run-pass +#![feature(adt_const_params, generic_const_exprs)] +#![allow(incomplete_features)] + +pub trait Foo { + const ASSOC_C: usize; + fn foo() where [(); Self::ASSOC_C]:; +} + +struct Bar<const N: &'static ()>; +impl<const N: &'static ()> Foo for Bar<N> { + const ASSOC_C: usize = 3; + + fn foo() where [u8; Self::ASSOC_C]: { + let _: [u8; Self::ASSOC_C] = loop {}; + } +} + +fn main() {} diff --git a/src/test/ui/const-generics/issues/issue-86535.rs b/src/test/ui/const-generics/issues/issue-86535.rs new file mode 100644 index 00000000000..5289c4e99dd --- /dev/null +++ b/src/test/ui/const-generics/issues/issue-86535.rs @@ -0,0 +1,20 @@ +// run-pass +#![feature(adt_const_params, generic_const_exprs)] +#![allow(incomplete_features, unused_variables)] + +struct F<const S: &'static str>; +impl<const S: &'static str> X for F<{ S }> { + const W: usize = 3; + + fn d(r: &[u8; Self::W]) -> F<{ S }> { + let x: [u8; Self::W] = [0; Self::W]; + F + } +} + +pub trait X { + const W: usize; + fn d(r: &[u8; Self::W]) -> Self; +} + +fn main() {} diff --git a/src/test/ui/const-generics/sneaky-array-repeat-expr.rs b/src/test/ui/const-generics/sneaky-array-repeat-expr.rs new file mode 100644 index 00000000000..b147c246bda --- /dev/null +++ b/src/test/ui/const-generics/sneaky-array-repeat-expr.rs @@ -0,0 +1,32 @@ +trait Trait<const N: usize> { + const Assoc: usize; +} + +impl<const N: usize> Trait<N> for () { + const Assoc: usize = 1; +} + + +pub const fn foo<const N: usize>() where (): Trait<N> { + let bar = [(); <()>::Assoc]; + //~^ error: constant expression depends on a generic parameter +} + +trait Trait2<const N: usize> { + const Assoc2: usize; +} + +impl<const N: usize> Trait2<N> for () { + const Assoc2: usize = N - 1; +} + + +pub const fn foo2<const N: usize>() where (): Trait2<N> { + let bar2 = [(); <()>::Assoc2]; + //~^ error: constant expression depends on a generic parameter +} + +fn main() { + foo::<0>(); + foo2::<0>(); +} diff --git a/src/test/ui/const-generics/sneaky-array-repeat-expr.stderr b/src/test/ui/const-generics/sneaky-array-repeat-expr.stderr new file mode 100644 index 00000000000..5c77375d399 --- /dev/null +++ b/src/test/ui/const-generics/sneaky-array-repeat-expr.stderr @@ -0,0 +1,18 @@ +error: constant expression depends on a generic parameter + --> $DIR/sneaky-array-repeat-expr.rs:11:20 + | +LL | let bar = [(); <()>::Assoc]; + | ^^^^^^^^^^^ + | + = note: this may fail depending on what value the parameter takes + +error: constant expression depends on a generic parameter + --> $DIR/sneaky-array-repeat-expr.rs:25:21 + | +LL | let bar2 = [(); <()>::Assoc2]; + | ^^^^^^^^^^^^ + | + = note: this may fail depending on what value the parameter takes + +error: aborting due to 2 previous errors + |
