port the relate-types code from NLL type-check into a type-op

Add regression tests for #55219 and #55241

Also another test where a duplicate-like error appears to have been
suppressed; I'm not 100% sure why this output changes, though I could
imagine that some duplicate suppression is enabled by this PR.
This commit is contained in:
Niko Matsakis 2018-10-24 12:08:34 -04:00
parent 7c8887ccbf
commit 62f0fc5112
7 changed files with 244 additions and 128 deletions

View file

@ -0,0 +1,20 @@
// Regression test for #55219:
//
// The `Self::HASH_LEN` here expands to a "self-type" where `T` is not
// known. This unbound inference variable was causing an ICE.
//
// run-pass
#![feature(nll)]
pub struct Foo<T>(T);
impl<T> Foo<T> {
const HASH_LEN: usize = 20;
fn stuff() {
let _ = Self::HASH_LEN;
}
}
fn main() { }

View file

@ -0,0 +1,28 @@
// Regression test for #55241:
//
// The reference to `C::HASHED_NULL_NODE` resulted in a type like `<C
// as NodeCodec<_>>::Out`; normalizing this type requires knowing the
// value of `_`; solving that requires having normalized, so we can
// test against `C: NodeCodec<H>` in the environment.
//
// run-pass
#![feature(nll)]
pub trait Hasher {
type Out: Eq;
}
pub trait NodeCodec<H: Hasher> {
const HASHED_NULL_NODE: H::Out;
}
pub trait Trie<H: Hasher, C: NodeCodec<H>> {
/// Return the root of the trie.
fn root(&self) -> &H::Out;
/// Is the trie empty?
fn is_empty(&self) -> bool { *self.root() == C::HASHED_NULL_NODE }
}
fn main() { }

View file

@ -12,21 +12,6 @@ LL | let z: &'a & usize = &(&y);
LL | }
| - temporary value is freed at the end of this statement
error[E0597]: `y` does not live long enough
--> $DIR/regions-free-region-ordering-caller1.rs:19:27
|
LL | fn call1<'a>(x: &'a usize) {
| -- lifetime `'a` defined here
...
LL | let z: &'a & usize = &(&y);
| ----------- ^^^^ borrowed value does not live long enough
| |
| type annotation requires that `y` is borrowed for `'a`
...
LL | }
| - `y` dropped here while still borrowed
error: aborting due to previous error
error: aborting due to 2 previous errors
Some errors occurred: E0597, E0716.
For more information about an error, try `rustc --explain E0597`.
For more information about this error, try `rustc --explain E0716`.