Rollup merge of #40404 - cengizIO:master, r=nikomatsakis
fix #40294 obligation cause.body_id is not always a NodeExpr Hello! This fixes #40294 and moves tests related to #38812 to a much more sensible directory. Thanks to @nikomatsakis and @eddyb
This commit is contained in:
commit
d208b2de10
7 changed files with 51 additions and 8 deletions
|
@ -23,11 +23,17 @@ use super::{
|
|||
ObjectSafetyViolation,
|
||||
};
|
||||
|
||||
use errors::DiagnosticBuilder;
|
||||
use fmt_macros::{Parser, Piece, Position};
|
||||
use hir::{intravisit, Local, Pat};
|
||||
use hir::intravisit::{Visitor, NestedVisitorMap};
|
||||
use hir::map::NodeExpr;
|
||||
use hir::def_id::DefId;
|
||||
use infer::{self, InferCtxt};
|
||||
use infer::type_variable::TypeVariableOrigin;
|
||||
use rustc::lint::builtin::EXTRA_REQUIREMENT_IN_IMPL;
|
||||
use std::fmt;
|
||||
use syntax::ast;
|
||||
use ty::{self, AdtKind, ToPredicate, ToPolyTraitRef, Ty, TyCtxt, TypeFoldable};
|
||||
use ty::error::ExpectedFound;
|
||||
use ty::fast_reject;
|
||||
|
@ -35,12 +41,8 @@ use ty::fold::TypeFolder;
|
|||
use ty::subst::Subst;
|
||||
use util::nodemap::{FxHashMap, FxHashSet};
|
||||
|
||||
use std::fmt;
|
||||
use syntax::ast;
|
||||
use hir::{intravisit, Local, Pat};
|
||||
use hir::intravisit::{Visitor, NestedVisitorMap};
|
||||
use syntax_pos::{DUMMY_SP, Span};
|
||||
use errors::DiagnosticBuilder;
|
||||
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Hash)]
|
||||
pub struct TraitErrorKey<'tcx> {
|
||||
|
@ -848,15 +850,18 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
|||
|
||||
err.span_label(cause.span, &format!("cannot infer type for `{}`", name));
|
||||
|
||||
let expr = self.tcx.hir.expect_expr(cause.body_id);
|
||||
|
||||
let mut local_visitor = FindLocalByTypeVisitor {
|
||||
infcx: &self,
|
||||
target_ty: &ty,
|
||||
found_pattern: None,
|
||||
};
|
||||
|
||||
local_visitor.visit_expr(expr);
|
||||
// #40294: cause.body_id can also be a fn declaration.
|
||||
// Currently, if it's anything other than NodeExpr, we just ignore it
|
||||
match self.tcx.hir.find(cause.body_id) {
|
||||
Some(NodeExpr(expr)) => local_visitor.visit_expr(expr),
|
||||
_ => ()
|
||||
}
|
||||
|
||||
if let Some(pattern) = local_visitor.found_pattern {
|
||||
let pattern_span = pattern.span;
|
||||
|
|
23
src/test/ui/type-check/issue-40294.rs
Normal file
23
src/test/ui/type-check/issue-40294.rs
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
trait Foo: Sized {
|
||||
fn foo(self);
|
||||
}
|
||||
|
||||
fn foo<'a,'b,T>(x: &'a T, y: &'b T)
|
||||
where &'a T : Foo,
|
||||
&'b T : Foo
|
||||
{
|
||||
x.foo();
|
||||
y.foo();
|
||||
}
|
||||
|
||||
fn main() { }
|
15
src/test/ui/type-check/issue-40294.stderr
Normal file
15
src/test/ui/type-check/issue-40294.stderr
Normal file
|
@ -0,0 +1,15 @@
|
|||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-40294.rs:15:1
|
||||
|
|
||||
15 | fn foo<'a,'b,T>(x: &'a T, y: &'b T)
|
||||
| _^ starting here...
|
||||
16 | | where &'a T : Foo,
|
||||
17 | | &'b T : Foo
|
||||
18 | | {
|
||||
19 | | x.foo();
|
||||
20 | | y.foo();
|
||||
21 | | }
|
||||
| |_^ ...ending here: cannot infer type for `&'a T`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Add table
Reference in a new issue