From e6a466e60c4660d8a74050189286e258918311e6 Mon Sep 17 00:00:00 2001 From: David Wood Date: Fri, 9 Nov 2018 15:39:32 +0100 Subject: [PATCH] Fix ICE and find correct return span. This commit fixes an ICE and determines the correct return span in cases with a method implemented on a struct with an an elided lifetime. --- .../error_reporting/region_name.rs | 34 ++++++++++--------- src/test/ui/nll/issue-55394.rs | 25 ++++++++++++++ src/test/ui/nll/issue-55394.stderr | 12 +++++++ 3 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 src/test/ui/nll/issue-55394.rs create mode 100644 src/test/ui/nll/issue-55394.stderr 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 @@ fn give_name_if_anonymous_region_appears_in_output( 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 or the MIT license +// , 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 +