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.
This commit is contained in:
David Wood 2018-11-09 15:39:32 +01:00
parent 653da4fd00
commit e6a466e60c
No known key found for this signature in database
GPG Key ID: 01760B4F9F53F154
3 changed files with 55 additions and 16 deletions

View File

@ -687,21 +687,23 @@ 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),
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"
},
)
} else {
// unreachable?
(mir.span, "")
),
hir::Node::ImplItem(hir::ImplItem {
node: hir::ImplItemKind::Method(method_sig, _),
..
}) => (method_sig.decl.output.span(), ""),
_ => (mir.span, ""),
};
Some(RegionName {

View File

@ -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() { }

View File

@ -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