Rollup merge of #63096 - Centril:existential-type-add-tests, r=varkor

Add tests for some `existential_type` ICEs

Fix #53678
Fix #60407
Fix #60564

https://github.com/rust-lang/rust/issues/54899 will need some minimization before it can be added.

r? @varkor
This commit is contained in:
Mazdak Farrokhzad 2019-07-30 05:37:39 +02:00 committed by GitHub
commit 09eb0b1b32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,19 @@
// check-pass
#![feature(const_fn, generators, generator_trait, existential_type)]
use std::ops::Generator;
existential type GenOnce<Y, R>: Generator<Yield = Y, Return = R>;
const fn const_generator<Y, R>(yielding: Y, returning: R) -> GenOnce<Y, R> {
move || {
yield yielding;
return returning;
}
}
const FOO: GenOnce<usize, usize> = const_generator(10, 100);
fn main() {}

View File

@ -0,0 +1,15 @@
// check-pass
#![feature(existential_type)]
existential type Debuggable: core::fmt::Debug;
static mut TEST: Option<Debuggable> = None;
fn main() {
unsafe { TEST = Some(foo()) }
}
fn foo() -> Debuggable {
0u32
}

View File

@ -0,0 +1,26 @@
#![feature(existential_type)]
trait IterBits {
type BitsIter: Iterator<Item = u8>;
fn iter_bits(self, n: u8) -> Self::BitsIter;
}
existential type IterBitsIter<T, E, I>: std::iter::Iterator<Item = I>;
//~^ ERROR could not find defining uses
impl<T, E> IterBits for T
where
T: std::ops::Shr<Output = T>
+ std::ops::BitAnd<T, Output = T>
+ std::convert::From<u8>
+ std::convert::TryInto<u8, Error = E>,
E: std::fmt::Debug,
{
type BitsIter = IterBitsIter<T, E, u8>;
fn iter_bits(self, n: u8) -> Self::BitsIter {
//~^ ERROR type parameter `E` is part of concrete type but not used
(0u8..n)
.rev()
.map(move |shift| ((self >> T::from(shift)) & T::from(1)).try_into().unwrap())
}
}

View File

@ -0,0 +1,25 @@
error[E0601]: `main` function not found in crate `issue_60564`
|
= note: consider adding a `main` function to `$DIR/issue-60564.rs`
error: type parameter `E` is part of concrete type but not used in parameter list for existential type
--> $DIR/issue-60564.rs:20:49
|
LL | fn iter_bits(self, n: u8) -> Self::BitsIter {
| _________________________________________________^
LL | |
LL | | (0u8..n)
LL | | .rev()
LL | | .map(move |shift| ((self >> T::from(shift)) & T::from(1)).try_into().unwrap())
LL | | }
| |_____^
error: could not find defining uses
--> $DIR/issue-60564.rs:8:1
|
LL | existential type IterBitsIter<T, E, I>: std::iter::Iterator<Item = I>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0601`.