Skip to content

Commit

Permalink
Auto merge of #72468 - Elinvynia:backport, r=Mark-Simulacrum
Browse files Browse the repository at this point in the history
[beta] Rollup backports

This includes:
* Fail if I/O error occurs during testing #72089
* Fix hang in lexical_region_resolve #72087
* Fix E0284 to not use incorrect wording #71960
* Bump pulldown-cmark #71682
  • Loading branch information
bors committed May 23, 2020
2 parents 0f0d700 + 9021f24 commit 02c25b3
Show file tree
Hide file tree
Showing 13 changed files with 148 additions and 24 deletions.
8 changes: 4 additions & 4 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ dependencies = [
"if_chain",
"itertools 0.9.0",
"lazy_static 1.4.0",
"pulldown-cmark 0.7.0",
"pulldown-cmark 0.7.1",
"quine-mc_cluskey",
"regex-syntax",
"semver",
Expand Down Expand Up @@ -2657,9 +2657,9 @@ dependencies = [

[[package]]
name = "pulldown-cmark"
version = "0.7.0"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c2d7fd131800e0d63df52aff46201acaab70b431a4a1ec6f0343fe8e64f35a4"
checksum = "3e142c3b8f49d2200605ee6ba0b1d757310e9e7a72afe78c36ee2ef67300ee00"
dependencies = [
"bitflags",
"memchr",
Expand Down Expand Up @@ -4355,7 +4355,7 @@ version = "0.0.0"
dependencies = [
"itertools 0.8.0",
"minifier",
"pulldown-cmark 0.7.0",
"pulldown-cmark 0.7.1",
"rustc-rayon",
"serde",
"serde_json",
Expand Down
20 changes: 16 additions & 4 deletions src/librustc_infer/infer/lexical_region_resolve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,21 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
}
}

debug!("enforce_member_constraint: final least choice = {:?}", least_choice);
if least_choice != member_lower_bound {
// (#72087) Different `ty::Regions` can be known to be equal, for
// example, we know that `'a` and `'static` are equal in a function
// with a parameter of type `&'static &'a ()`.
//
// When we have two equal regions like this `expansion` will use
// `lub_concrete_regions` to pick a canonical representative. The same
// choice is needed here so that we don't end up in a cycle of
// `expansion` changing the region one way and the code here changing
// it back.
let lub = self.lub_concrete_regions(least_choice, member_lower_bound);
debug!(
"enforce_member_constraint: final least choice = {:?}\nlub = {:?}",
least_choice, lub
);
if lub != member_lower_bound {
*var_values.value_mut(member_vid) = VarValue::Value(least_choice);
true
} else {
Expand Down Expand Up @@ -578,8 +591,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
self.tcx().mk_region(ReScope(lub))
}

(&ReEarlyBound(_), &ReEarlyBound(_) | &ReFree(_))
| (&ReFree(_), &ReEarlyBound(_) | &ReFree(_)) => {
(&ReEarlyBound(_) | &ReFree(_), &ReEarlyBound(_) | &ReFree(_)) => {
self.region_rels.lub_free_regions(a, b)
}

Expand Down
20 changes: 17 additions & 3 deletions src/librustc_trait_selection/traits/error_reporting/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1482,12 +1482,26 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> {
ty::Predicate::Projection(ref data) => {
let trait_ref = data.to_poly_trait_ref(self.tcx);
let self_ty = trait_ref.self_ty();
let ty = data.skip_binder().ty;
if predicate.references_error() {
return;
}
let mut err = self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0284);
err.note(&format!("cannot satisfy `{}`", predicate));
err
if self_ty.needs_infer() && ty.needs_infer() {
// We do this for the `foo.collect()?` case to produce a suggestion.
let mut err = self.need_type_info_err(body_id, span, self_ty, ErrorCode::E0284);
err.note(&format!("cannot satisfy `{}`", predicate));
err
} else {
let mut err = struct_span_err!(
self.tcx.sess,
span,
E0284,
"type annotations needed: cannot satisfy `{}`",
predicate,
);
err.span_label(span, &format!("cannot satisfy `{}`", predicate));
err
}
}

_ => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
error[E0284]: type annotations needed
error[E0284]: type annotations needed: cannot satisfy `<Self as std::iter::Iterator>::Item == i32`
--> $DIR/associated-types-overridden-binding.rs:4:12
|
LL | trait Foo: Iterator<Item = i32> {}
| ---------- required by this bound in `Foo`
LL | trait Bar: Foo<Item = u32> {}
| ^^^^^^^^^^^^^^^ cannot infer type for type parameter `Self`
|
= note: cannot satisfy `<Self as std::iter::Iterator>::Item == i32`
| ^^^^^^^^^^^^^^^ cannot satisfy `<Self as std::iter::Iterator>::Item == i32`

error[E0284]: type annotations needed
error[E0284]: type annotations needed: cannot satisfy `<Self as std::iter::Iterator>::Item == i32`
--> $DIR/associated-types-overridden-binding.rs:7:21
|
LL | trait I32Iterator = Iterator<Item = i32>;
| ---------- required by this bound in `I32Iterator`
LL | trait U32Iterator = I32Iterator<Item = u32>;
| ^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `Self`
|
= note: cannot satisfy `<Self as std::iter::Iterator>::Item == i32`
| ^^^^^^^^^^^^^^^^^^^^^^^ cannot satisfy `<Self as std::iter::Iterator>::Item == i32`

error: aborting due to 2 previous errors

Expand Down
6 changes: 2 additions & 4 deletions src/test/ui/issues/issue-12028.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
error[E0284]: type annotations needed
error[E0284]: type annotations needed: cannot satisfy `<_ as StreamHasher>::S == <H as StreamHasher>::S`
--> $DIR/issue-12028.rs:27:14
|
LL | self.input_stream(&mut stream);
| ^^^^^^^^^^^^ cannot infer type for type parameter `H` declared on the trait `StreamHash`
|
= note: cannot satisfy `<_ as StreamHasher>::S == <H as StreamHasher>::S`
| ^^^^^^^^^^^^ cannot satisfy `<_ as StreamHasher>::S == <H as StreamHasher>::S`

error: aborting due to previous error

Expand Down
30 changes: 30 additions & 0 deletions src/test/ui/issues/issue-69455.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Regression test for #69455: projection predicate was not satisfied.
// Compiler should indicate the correct location of the
// unsatisfied projection predicate

pub trait Test<Rhs = Self> {
type Output;

fn test(self, rhs: Rhs) -> Self::Output;
}

impl Test<u32> for u64 {
type Output = u64;

fn test(self, other: u32) -> u64 {
self + (other as u64)
}
}

impl Test<u64> for u64 {
type Output = u64;

fn test(self, other: u64) -> u64 {
(self + other) as u64
}
}

fn main() {
let xs: Vec<u64> = vec![1, 2, 3];
println!("{}", 23u64.test(xs.iter().sum())); //~ ERROR: type annotations needed
}
9 changes: 9 additions & 0 deletions src/test/ui/issues/issue-69455.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0284]: type annotations needed: cannot satisfy `<u64 as Test<_>>::Output == _`
--> $DIR/issue-69455.rs:29:26
|
LL | println!("{}", 23u64.test(xs.iter().sum()));
| ^^^^ cannot satisfy `<u64 as Test<_>>::Output == _`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0284`.
32 changes: 32 additions & 0 deletions src/test/ui/issues/issue-69683.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
pub trait Element<S> {
type Array;
}

impl<T> Element<()> for T {
type Array = T;
}

impl<T: Element<S>, S> Element<[S; 3]> for T {
type Array = [T::Array; 3];
}

trait Foo<I>
where
u8: Element<I>,
{
fn foo(self, x: <u8 as Element<I>>::Array);
}

impl<I> Foo<I> for u16
where
u8: Element<I>,
{
fn foo(self, _: <u8 as Element<I>>::Array) {}
}

fn main() {
let b: [u8; 3] = [0u8; 3];

0u16.foo(b); //~ ERROR type annotations needed
//<u16 as Foo<[(); 3]>>::foo(0u16, b);
}
9 changes: 9 additions & 0 deletions src/test/ui/issues/issue-69683.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0284]: type annotations needed: cannot satisfy `<u8 as Element<_>>::Array == [u8; 3]`
--> $DIR/issue-69683.rs:30:10
|
LL | 0u16.foo(b);
| ^^^ cannot satisfy `<u8 as Element<_>>::Array == [u8; 3]`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0284`.
5 changes: 5 additions & 0 deletions src/test/ui/issues/issue-71584.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
fn main() {
let n: u32 = 1;
let mut d: u64 = 2;
d = d % n.into(); //~ ERROR type annotations needed
}
9 changes: 9 additions & 0 deletions src/test/ui/issues/issue-71584.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0284]: type annotations needed: cannot satisfy `<u64 as std::ops::Rem<_>>::Output == u64`
--> $DIR/issue-71584.rs:4:11
|
LL | d = d % n.into();
| ^ cannot satisfy `<u64 as std::ops::Rem<_>>::Output == u64`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0284`.
7 changes: 7 additions & 0 deletions src/test/ui/regions/issue-72051-member-region-hang.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Regression test for #72051, hang when resolving regions.

// check-pass
// edition:2018

pub async fn query<'a>(_: &(), _: &(), _: (&(dyn std::any::Any + 'a),) ) {}
fn main() {}
5 changes: 4 additions & 1 deletion src/tools/compiletest/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,10 @@ pub fn run_tests(config: Config) {
Ok(true) => {}
Ok(false) => panic!("Some tests failed"),
Err(e) => {
println!("I/O failure during tests: {:?}", e);
// We don't know if tests passed or not, but if there was an error
// during testing we don't want to just suceeed (we may not have
// tested something), so fail.
panic!("I/O failure during tests: {:?}", e);
}
}
}
Expand Down

0 comments on commit 02c25b3

Please sign in to comment.