Skip to content

Commit

Permalink
Merge pull request #2833 from phansch/cannot_relate_bound_region_with…
Browse files Browse the repository at this point in the history
…out_ICE_cream

Fix cargo late bound region mismatch ICE
  • Loading branch information
oli-obk committed Jun 7, 2018
2 parents 7563d81 + 17aff1d commit 2a2e602
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 1 deletion.
6 changes: 5 additions & 1 deletion clippy_lints/src/utils/mod.rs
Expand Up @@ -8,7 +8,7 @@ use rustc::hir::map::Node;
use rustc::lint::{LateContext, Level, Lint, LintContext};
use rustc::session::Session;
use rustc::traits;
use rustc::ty::{self, Ty, TyCtxt, layout::{self, IntegerExt}, subst::Kind};
use rustc::ty::{self, Binder, Ty, TyCtxt, layout::{self, IntegerExt}, subst::Kind};
use rustc_errors::{Applicability, CodeSuggestion, Substitution, SubstitutionPart};
use std::borrow::Cow;
use std::env;
Expand Down Expand Up @@ -869,10 +869,14 @@ pub fn return_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, fn_item: NodeId) -> Ty<'t
}

/// Check if two types are the same.
///
/// This discards any lifetime annotations, too.
// FIXME: this works correctly for lifetimes bounds (`for <'a> Foo<'a>` == `for
// <'b> Foo<'b>` but
// not for type parameters.
pub fn same_tys<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, a: Ty<'tcx>, b: Ty<'tcx>) -> bool {
let a = cx.tcx.erase_late_bound_regions(&Binder::bind(a));
let b = cx.tcx.erase_late_bound_regions(&Binder::bind(b));
cx.tcx
.infer_ctxt()
.enter(|infcx| infcx.can_eq(cx.param_env, a, b).is_ok())
Expand Down
31 changes: 31 additions & 0 deletions tests/run-pass/ice-2774.rs
@@ -0,0 +1,31 @@
use std::collections::HashSet;

// See https://github.com/rust-lang-nursery/rust-clippy/issues/2774

#[derive(Eq, PartialEq, Debug, Hash)]
pub struct Bar {
foo: Foo,
}

#[derive(Eq, PartialEq, Debug, Hash)]
pub struct Foo {}

#[allow(implicit_hasher)]
// This should not cause a 'cannot relate bound region' ICE
pub fn add_barfoos_to_foos<'a>(bars: &HashSet<&'a Bar>) {
let mut foos = HashSet::new();
foos.extend(
bars.iter().map(|b| &b.foo)
);
}

#[allow(implicit_hasher)]
// Also this should not cause a 'cannot relate bound region' ICE
pub fn add_barfoos_to_foos2(bars: &HashSet<&Bar>) {
let mut foos = HashSet::new();
foos.extend(
bars.iter().map(|b| &b.foo)
);
}

fn main() {}

0 comments on commit 2a2e602

Please sign in to comment.