about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs34
-rw-r--r--src/test/ui/nll/issue-55394.rs25
-rw-r--r--src/test/ui/nll/issue-55394.stderr12
3 files changed, 55 insertions, 16 deletions
diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs
index 99372a511a9..a32fb0503a8 100644
--- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs
+++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs
@@ -687,22 +687,24 @@ impl<'tcx> RegionInferenceContext<'tcx> {
 
         let mir_node_id = tcx.hir.as_local_node_id(mir_def_id).expect("non-local mir");
 
-        let (return_span, mir_description) =
-            if let hir::ExprKind::Closure(_, _, _, span, gen_move) =
-                tcx.hir.expect_expr(mir_node_id).node
-            {
-                (
-                    tcx.sess.source_map().end_point(span),
-                    if gen_move.is_some() {
-                        " of generator"
-                    } else {
-                        " of closure"
-                    },
-                )
-            } else {
-                // unreachable?
-                (mir.span, "")
-            };
+        let (return_span, mir_description) = match tcx.hir.get(mir_node_id) {
+            hir::Node::Expr(hir::Expr {
+                node: hir::ExprKind::Closure(_, _, _, span, gen_move),
+                ..
+            }) => (
+                tcx.sess.source_map().end_point(*span),
+                if gen_move.is_some() {
+                    " of generator"
+                } else {
+                    " of closure"
+                },
+            ),
+            hir::Node::ImplItem(hir::ImplItem {
+                node: hir::ImplItemKind::Method(method_sig, _),
+                ..
+            }) => (method_sig.decl.output.span(), ""),
+            _ => (mir.span, ""),
+        };
 
         Some(RegionName {
             // This counter value will already have been used, so this function will increment it
diff --git a/src/test/ui/nll/issue-55394.rs b/src/test/ui/nll/issue-55394.rs
new file mode 100644
index 00000000000..452fc88d1ec
--- /dev/null
+++ b/src/test/ui/nll/issue-55394.rs
@@ -0,0 +1,25 @@
+// 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.
+
+#![feature(nll)]
+
+struct Bar;
+
+struct Foo<'s> {
+    bar: &'s mut Bar,
+}
+
+impl Foo<'_> {
+    fn new(bar: &mut Bar) -> Self {
+        Foo { bar }
+    }
+}
+
+fn main() { }
diff --git a/src/test/ui/nll/issue-55394.stderr b/src/test/ui/nll/issue-55394.stderr
new file mode 100644
index 00000000000..284d7afa6fd
--- /dev/null
+++ b/src/test/ui/nll/issue-55394.stderr
@@ -0,0 +1,12 @@
+error: unsatisfied lifetime constraints
+  --> $DIR/issue-55394.rs:21:9
+   |
+LL |     fn new(bar: &mut Bar) -> Self {
+   |                 -            ---- return type is Foo<'2>
+   |                 |
+   |                 let's call the lifetime of this reference `'1`
+LL |         Foo { bar }
+   |         ^^^^^^^^^^^ returning this value requires that `'1` must outlive `'2`
+
+error: aborting due to previous error
+