Change:
Receiving info about MIR or some other intermediate form in a user error report. I tried this code which most likely has some lifetime issue that I am yet to resolve: I should have received information about the scope defined by some part of my code or if the issue is with auto-generated code then possibly no information about an internal scope. Instead, this happened: :
This seems to be more common than I first thought: Made a resulted in:
Issue exists in latest nightly as well.
Can confirm experiencing it. Smaller sample: Not an issue in current stable or beta, which reports rather than
Does this qualify as a regression?
Yes, though not the kind we'd do a point release for, IMO
should mark as such then :)
Here's another small one:
It took me a minute to figure out that this issue is about the error message & not the error. I've also been getting CallSiteScope and so on nonsense in my error output recently. This seems like a pretty serious regression in the usability of our error messages! My impression has been that this impacts just about every lifetime issue I've been getting recently, but I could be wrong. Could we get this fixed by next stable release? I disagree with that this isn't worth making a point release for (currently its only in nightly, so that's not an issue).
Nominated for consideration by the compiler team.
This appears to be in beta (testing on the playground). Super tiny repro: gives
Has nobody looked into this? I'll take a peek before the compiler meeting today. EDIT: Of course it was me who introduced this bug, or rather triggered sigh. EDIT2: Basically, after , any uses of are suspicious. I'll try to make a PR.
Fix is at , using reduction as the testcase for this issue.
triage: P-high We have a fix though =)

Discussion:
} } <ins> fn trait_item_scope_tag(item: &hir::TraitItem) -> &'static str { match item.node { hir::TraitItemKind::Method(..) => "method body", hir::TraitItemKind::Const(..) | hir::TraitItemKind::Type(..) => "associated item" } } fn impl_item_scope_tag(item: &hir::ImplItem) -> &'static str { match item.node { hir::ImplItemKind::Method(..) => "method body", hir::ImplItemKind::Const(..) | hir::ImplItemKind::Type(_) => "associated item" } } </ins> fn explain_span<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>, heading: &str, span: Span) -> (String, Option<Span>) {

}, Some(ast_map::NodeStmt(_)) => "statement", Some(ast_map::NodeItem(it)) => item_scope_tag(&it), <ins> Some(ast_map::NodeTraitItem(it)) => trait_item_scope_tag(&it), Some(ast_map::NodeImplItem(it)) => impl_item_scope_tag(&it), </ins> Some(_) | None => { err.span_note(span, &unknown_scope()); return;

} }; <del> match self.map.find(fr.scope.node_id(&self.region_maps)) { Some(ast_map::NodeBlock(ref blk)) => { let (msg, opt_span) = explain_span(self, "block", blk.span); (format!("{} {}", prefix, msg), opt_span) } Some(ast_map::NodeItem(it)) => { let tag = item_scope_tag(&it); let (msg, opt_span) = explain_span(self, tag, it.span); (format!("{} {}", prefix, msg), opt_span) </del> <ins> let node = fr.scope.node_id(&self.region_maps); let unknown; let tag = match self.map.find(node) { Some(ast_map::NodeBlock(_)) | Some(ast_map::NodeExpr(_)) => "body", Some(ast_map::NodeItem(it)) => item_scope_tag(&it), Some(ast_map::NodeTraitItem(it)) => trait_item_scope_tag(&it), Some(ast_map::NodeImplItem(it)) => impl_item_scope_tag(&it), // this really should not happen, but it does: // FIXME(#27942) Some(_) => { unknown = format!("unexpected node ({}) for scope {:?}.   Please report a bug.", self.map.node_to_string(node), fr.scope); &unknown </ins> } <del> Some(_) | None => { // this really should not happen, but it does: // FIXME(#27942) (format!("{} unknown free region bounded by scope {:?}", prefix, fr.scope), None) </del> <ins> None => { unknown = format!("unknown node for scope {:?}.   Please report a bug.", fr.scope); &unknown </ins> } <del> } </del> <ins> }; let (msg, opt_span) = explain_span(self, tag, self.map.span(node)); (format!("{} {}", prefix, msg), opt_span) </ins> } ty::ReStatic => ("the static lifetime".to_owned(), None),

<ins> // Copyright 2016 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. pub trait Resources<'a> {} pub trait Buffer<'a, R: Resources<'a>> { fn select(&self) -> BufferViewHandle<R>; //~^ ERROR mismatched types //~| lifetime mismatch //~| NOTE expected type `Resources<'_>` //~| NOTE    found type `Resources<'a>` //~| NOTE the lifetime 'a as defined on the method body at 14:4... //~| NOTE ...does not necessarily outlive the anonymous lifetime #1 defined on the method body //~| ERROR mismatched types //~| lifetime mismatch //~| NOTE expected type `Resources<'_>` //~| NOTE    found type `Resources<'a>` //~| NOTE the anonymous lifetime #1 defined on the method body at 14:4... //~| NOTE ...does not necessarily outlive the lifetime 'a as defined on the method body } pub struct BufferViewHandle<'a, R: 'a+Resources<'a>>(&'a R); fn main() {} </ins>

<ins> // Copyright 2016 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. struct RepeatMut<'a, T>(T, &'a ()); impl<'a, T: 'a> Iterator for RepeatMut<'a, T> { type Item = &'a mut T; fn next(&'a mut self) -> Option<Self::Item> //~^ ERROR method not compatible with trait //~| lifetime mismatch //~| NOTE expected type `fn(&mut RepeatMut<'a, T>) -> std::option::Option<&mut T>` //~| NOTE    found type `fn(&'a mut RepeatMut<'a, T>) -> std::option::Option<&mut T>` { //~^ NOTE the anonymous lifetime #1 defined on the body //~| NOTE ...does not necessarily outlive the lifetime 'a as defined on the body Some(&mut self.0) } } fn main() {} </ins>