Auto merge of #47329 - davidtwco:issue-46983, r=nikomatsakis
NLL: bad error message when converting anonymous lifetime to `'static` Fixes #46983. r? @nikomatsakis
This commit is contained in:
commit
8ff449d505
15 changed files with 65 additions and 31 deletions
|
@ -118,4 +118,17 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> {
|
||||||
.emit();
|
.emit();
|
||||||
return Some(ErrorReported);
|
return Some(ErrorReported);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This method returns whether the given Region is Named
|
||||||
|
pub(super) fn is_named_region(&self, region: ty::Region<'tcx>) -> bool {
|
||||||
|
match *region {
|
||||||
|
ty::ReStatic => true,
|
||||||
|
ty::ReFree(ref free_region) => match free_region.bound_region {
|
||||||
|
ty::BrNamed(..) => true,
|
||||||
|
_ => false,
|
||||||
|
},
|
||||||
|
ty::ReEarlyBound(_) => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,16 +198,4 @@ impl<'a, 'gcx, 'tcx> NiceRegionError<'a, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method returns whether the given Region is Named
|
|
||||||
pub(super) fn is_named_region(&self, region: Region<'tcx>) -> bool {
|
|
||||||
match *region {
|
|
||||||
ty::ReFree(ref free_region) => match free_region.bound_region {
|
|
||||||
ty::BrNamed(..) => true,
|
|
||||||
_ => false,
|
|
||||||
},
|
|
||||||
ty::ReEarlyBound(_) => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ fn bar<F>(blk: F) where F: FnOnce() + 'static {
|
||||||
|
|
||||||
fn foo(x: &()) {
|
fn foo(x: &()) {
|
||||||
bar(|| {
|
bar(|| {
|
||||||
//~^ ERROR does not fulfill
|
//~^ ERROR explicit lifetime required in the type of `x` [E0621]
|
||||||
let _ = x;
|
let _ = x;
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
fn elided(x: &i32) -> impl Copy { x }
|
fn elided(x: &i32) -> impl Copy { x }
|
||||||
//~^ ERROR cannot infer an appropriate lifetime
|
//~^ ERROR explicit lifetime required in the type of `x` [E0621]
|
||||||
|
|
||||||
fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||||
//~^ ERROR cannot infer an appropriate lifetime
|
//~^ ERROR cannot infer an appropriate lifetime
|
||||||
|
|
|
@ -12,7 +12,7 @@ use std::any::Any;
|
||||||
|
|
||||||
fn foo<T: Any>(value: &T) -> Box<Any> {
|
fn foo<T: Any>(value: &T) -> Box<Any> {
|
||||||
Box::new(value) as Box<Any>
|
Box::new(value) as Box<Any>
|
||||||
//~^ ERROR: cannot infer an appropriate lifetime
|
//~^ ERROR explicit lifetime required in the type of `value` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -25,7 +25,7 @@ fn load(ss: &mut SomeStruct) -> Box<SomeTrait> {
|
||||||
// `Box<SomeTrait>` defaults to a `'static` bound, so this return
|
// `Box<SomeTrait>` defaults to a `'static` bound, so this return
|
||||||
// is illegal.
|
// is illegal.
|
||||||
|
|
||||||
ss.r //~ ERROR cannot infer an appropriate lifetime
|
ss.r //~ ERROR explicit lifetime required in the type of `ss` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn store(ss: &mut SomeStruct, b: Box<SomeTrait>) {
|
fn store(ss: &mut SomeStruct, b: Box<SomeTrait>) {
|
||||||
|
|
|
@ -16,20 +16,20 @@ impl<'a> Foo for &'a [u8] {}
|
||||||
|
|
||||||
fn a(v: &[u8]) -> Box<Foo + 'static> {
|
fn a(v: &[u8]) -> Box<Foo + 'static> {
|
||||||
let x: Box<Foo + 'static> = Box::new(v);
|
let x: Box<Foo + 'static> = Box::new(v);
|
||||||
//~^ ERROR cannot infer an appropriate lifetime due to conflicting
|
//~^ ERROR explicit lifetime required in the type of `v` [E0621]
|
||||||
x
|
x
|
||||||
}
|
}
|
||||||
|
|
||||||
fn b(v: &[u8]) -> Box<Foo + 'static> {
|
fn b(v: &[u8]) -> Box<Foo + 'static> {
|
||||||
Box::new(v)
|
Box::new(v)
|
||||||
//~^ ERROR cannot infer an appropriate lifetime due to conflicting
|
//~^ ERROR explicit lifetime required in the type of `v` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn c(v: &[u8]) -> Box<Foo> {
|
fn c(v: &[u8]) -> Box<Foo> {
|
||||||
// same as previous case due to RFC 599
|
// same as previous case due to RFC 599
|
||||||
|
|
||||||
Box::new(v)
|
Box::new(v)
|
||||||
//~^ ERROR cannot infer an appropriate lifetime due to conflicting
|
//~^ ERROR explicit lifetime required in the type of `v` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn d<'a,'b>(v: &'a [u8]) -> Box<Foo+'b> {
|
fn d<'a,'b>(v: &'a [u8]) -> Box<Foo+'b> {
|
||||||
|
|
|
@ -16,7 +16,7 @@ fn borrowed_proc<'a>(x: &'a isize) -> Box<FnMut()->(isize) + 'a> {
|
||||||
|
|
||||||
fn static_proc(x: &isize) -> Box<FnMut()->(isize) + 'static> {
|
fn static_proc(x: &isize) -> Box<FnMut()->(isize) + 'static> {
|
||||||
// This is illegal, because the region bound on `proc` is 'static.
|
// This is illegal, because the region bound on `proc` is 'static.
|
||||||
Box::new(move|| { *x }) //~ ERROR cannot infer an appropriate lifetime
|
Box::new(move|| { *x }) //~ ERROR explicit lifetime required in the type of `x` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() { }
|
||||||
|
|
|
@ -22,12 +22,12 @@ fn static_id_wrong_way<'a>(t: &'a ()) -> &'static () where 'static: 'a {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn error(u: &(), v: &()) {
|
fn error(u: &(), v: &()) {
|
||||||
static_id(&u); //[ll]~ ERROR cannot infer an appropriate lifetime
|
static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of `u` [E0621]
|
||||||
//[nll]~^ WARNING not reporting region error due to -Znll
|
//[nll]~^ WARNING not reporting region error due to -Znll
|
||||||
//[nll]~| ERROR free region `` does not outlive free region `'static`
|
//[nll]~| ERROR explicit lifetime required in the type of `u` [E0621]
|
||||||
static_id_indirect(&v); //[ll]~ ERROR cannot infer an appropriate lifetime
|
static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
|
||||||
//[nll]~^ WARNING not reporting region error due to -Znll
|
//[nll]~^ WARNING not reporting region error due to -Znll
|
||||||
//[nll]~| ERROR free region `` does not outlive free region `'static`
|
//[nll]~| ERROR explicit lifetime required in the type of `v` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
18
src/test/ui/issue-46983.rs
Normal file
18
src/test/ui/issue-46983.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// 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)]
|
||||||
|
|
||||||
|
fn foo(x: &u32) -> &'static u32 {
|
||||||
|
&*x
|
||||||
|
//~^ ERROR explicit lifetime required in the type of `x` [E0621]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
10
src/test/ui/issue-46983.stderr
Normal file
10
src/test/ui/issue-46983.stderr
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
error[E0621]: explicit lifetime required in the type of `x`
|
||||||
|
--> $DIR/issue-46983.rs:14:5
|
||||||
|
|
|
||||||
|
13 | fn foo(x: &u32) -> &'static u32 {
|
||||||
|
| - consider changing the type of `x` to `&'static u32`
|
||||||
|
14 | &*x
|
||||||
|
| ^^^ lifetime `'static` required
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
fn foo(x: &u32) -> &'static u32 {
|
fn foo(x: &u32) -> &'static u32 {
|
||||||
&*x
|
&*x
|
||||||
//~^ WARN not reporting region error due to -Znll
|
//~^ WARN not reporting region error due to -Znll
|
||||||
//~| ERROR does not outlive free region
|
//~| ERROR explicit lifetime required in the type of `x`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() { }
|
||||||
|
|
|
@ -4,11 +4,13 @@ warning: not reporting region error due to -Znll
|
||||||
19 | &*x
|
19 | &*x
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error: free region `ReFree(DefId(0/0:3 ~ region_lbr_anon_does_not_outlive_static[317d]::foo[0]), BrAnon(0))` does not outlive free region `ReStatic`
|
error[E0621]: explicit lifetime required in the type of `x`
|
||||||
--> $DIR/region-lbr-anon-does-not-outlive-static.rs:19:5
|
--> $DIR/region-lbr-anon-does-not-outlive-static.rs:19:5
|
||||||
|
|
|
|
||||||
|
18 | fn foo(x: &u32) -> &'static u32 {
|
||||||
|
| - consider changing the type of `x` to `&ReStatic u32`
|
||||||
19 | &*x
|
19 | &*x
|
||||||
| ^^^
|
| ^^^ lifetime `ReStatic` required
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ fn foo(s: &mut (i32,)) -> i32 {
|
||||||
|
|
||||||
fn bar(s: &Box<(i32,)>) -> &'static i32 {
|
fn bar(s: &Box<(i32,)>) -> &'static i32 {
|
||||||
// FIXME(#46983): error message should be better
|
// FIXME(#46983): error message should be better
|
||||||
&s.0 //~ ERROR free region `` does not outlive free region `'static`
|
&s.0 //~ ERROR explicit lifetime required in the type of `s` [E0621]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -7,11 +7,14 @@ error[E0506]: cannot assign to `*s` because it is borrowed
|
||||||
19 | *s = (2,); //~ ERROR cannot assign to `*s`
|
19 | *s = (2,); //~ ERROR cannot assign to `*s`
|
||||||
| ^^^^^^^^^ assignment to borrowed `*s` occurs here
|
| ^^^^^^^^^ assignment to borrowed `*s` occurs here
|
||||||
|
|
||||||
error: free region `` does not outlive free region `'static`
|
error[E0621]: explicit lifetime required in the type of `s`
|
||||||
--> $DIR/guarantor-issue-46974.rs:25:5
|
--> $DIR/guarantor-issue-46974.rs:25:5
|
||||||
|
|
|
|
||||||
25 | &s.0 //~ ERROR free region `` does not outlive free region `'static`
|
23 | fn bar(s: &Box<(i32,)>) -> &'static i32 {
|
||||||
| ^^^^
|
| - consider changing the type of `s` to `&'static std::boxed::Box<(i32,)>`
|
||||||
|
24 | // FIXME(#46983): error message should be better
|
||||||
|
25 | &s.0 //~ ERROR explicit lifetime required in the type of `s` [E0621]
|
||||||
|
| ^^^^ lifetime `'static` required
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue