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:
parent
653da4fd00
commit
e6a466e60c
@ -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
|
||||
|
25
src/test/ui/nll/issue-55394.rs
Normal file
25
src/test/ui/nll/issue-55394.rs
Normal 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() { }
|
12
src/test/ui/nll/issue-55394.stderr
Normal file
12
src/test/ui/nll/issue-55394.stderr
Normal 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
|
||||
|
Loading…
Reference in New Issue
Block a user