about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <arielb1@mail.tau.ac.il>2017-03-11 21:57:48 +0200
committerGitHub <noreply@github.com>2017-03-11 21:57:48 +0200
commitd208b2de1055b17fca6282c8af00a39414e9af90 (patch)
tree86dce0a70a90d7fa21fa4bcfde3375e9aada4cf6 /src
parent25dcbca0ad6024671be33a23cc40701342095404 (diff)
parent889337da06e764369897ef15a6dfca6f27879a45 (diff)
downloadrust-d208b2de1055b17fca6282c8af00a39414e9af90.tar.gz
rust-d208b2de1055b17fca6282c8af00a39414e9af90.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/librustc/traits/error_reporting.rs21
-rw-r--r--src/test/ui/type-check/issue-38812-2.rs (renamed from src/test/ui/codemap_tests/issue-38812-2.rs)0
-rw-r--r--src/test/ui/type-check/issue-38812-2.stderr (renamed from src/test/ui/codemap_tests/issue-38812-2.stderr)0
-rw-r--r--src/test/ui/type-check/issue-38812.rs (renamed from src/test/ui/codemap_tests/issue-38812.rs)0
-rw-r--r--src/test/ui/type-check/issue-38812.stderr (renamed from src/test/ui/codemap_tests/issue-38812.stderr)0
-rw-r--r--src/test/ui/type-check/issue-40294.rs23
-rw-r--r--src/test/ui/type-check/issue-40294.stderr15
7 files changed, 51 insertions, 8 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index 99db5f9b624..0e5c786cd8d 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -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;
diff --git a/src/test/ui/codemap_tests/issue-38812-2.rs b/src/test/ui/type-check/issue-38812-2.rs
index c476657d207..c476657d207 100644
--- a/src/test/ui/codemap_tests/issue-38812-2.rs
+++ b/src/test/ui/type-check/issue-38812-2.rs
diff --git a/src/test/ui/codemap_tests/issue-38812-2.stderr b/src/test/ui/type-check/issue-38812-2.stderr
index 156a6bdee99..156a6bdee99 100644
--- a/src/test/ui/codemap_tests/issue-38812-2.stderr
+++ b/src/test/ui/type-check/issue-38812-2.stderr
diff --git a/src/test/ui/codemap_tests/issue-38812.rs b/src/test/ui/type-check/issue-38812.rs
index a9943f75336..a9943f75336 100644
--- a/src/test/ui/codemap_tests/issue-38812.rs
+++ b/src/test/ui/type-check/issue-38812.rs
diff --git a/src/test/ui/codemap_tests/issue-38812.stderr b/src/test/ui/type-check/issue-38812.stderr
index 6365e761453..6365e761453 100644
--- a/src/test/ui/codemap_tests/issue-38812.stderr
+++ b/src/test/ui/type-check/issue-38812.stderr
diff --git a/src/test/ui/type-check/issue-40294.rs b/src/test/ui/type-check/issue-40294.rs
new file mode 100644
index 00000000000..d30a425d109
--- /dev/null
+++ b/src/test/ui/type-check/issue-40294.rs
@@ -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() { }
diff --git a/src/test/ui/type-check/issue-40294.stderr b/src/test/ui/type-check/issue-40294.stderr
new file mode 100644
index 00000000000..5c388c9d602
--- /dev/null
+++ b/src/test/ui/type-check/issue-40294.stderr
@@ -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
+