add ellided lifetime
This commit is contained in:
parent
fe7e1a45f3
commit
accd997b54
4 changed files with 55 additions and 4 deletions
|
|
@ -246,6 +246,12 @@ declare_lint! {
|
||||||
"raw pointer to an inference variable"
|
"raw pointer to an inference variable"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare_lint! {
|
||||||
|
pub ELIDED_LIFETIME_IN_PATH,
|
||||||
|
Allow,
|
||||||
|
"hidden lifetime parameters are deprecated, try `Foo<'_>`"
|
||||||
|
}
|
||||||
|
|
||||||
/// Does nothing as a lint pass, but registers some `Lint`s
|
/// Does nothing as a lint pass, but registers some `Lint`s
|
||||||
/// which are used by other parts of the compiler.
|
/// which are used by other parts of the compiler.
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
|
|
@ -291,7 +297,9 @@ impl LintPass for HardwiredLints {
|
||||||
UNUSED_MUT,
|
UNUSED_MUT,
|
||||||
COERCE_NEVER,
|
COERCE_NEVER,
|
||||||
SINGLE_USE_LIFETIME,
|
SINGLE_USE_LIFETIME,
|
||||||
TYVAR_BEHIND_RAW_POINTER
|
TYVAR_BEHIND_RAW_POINTER,
|
||||||
|
ELIDED_LIFETIME_IN_PATH
|
||||||
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -737,7 +737,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
||||||
|
|
||||||
fn visit_lifetime(&mut self, lifetime_ref: &'tcx hir::Lifetime) {
|
fn visit_lifetime(&mut self, lifetime_ref: &'tcx hir::Lifetime) {
|
||||||
if lifetime_ref.is_elided() {
|
if lifetime_ref.is_elided() {
|
||||||
self.resolve_elided_lifetimes(slice::from_ref(lifetime_ref));
|
self.resolve_elided_lifetimes(slice::from_ref(lifetime_ref), false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if lifetime_ref.is_static() {
|
if lifetime_ref.is_static() {
|
||||||
|
|
@ -1444,7 +1444,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.lifetimes.iter().all(|l| l.is_elided()) {
|
if params.lifetimes.iter().all(|l| l.is_elided()) {
|
||||||
self.resolve_elided_lifetimes(¶ms.lifetimes);
|
self.resolve_elided_lifetimes(¶ms.lifetimes, true);
|
||||||
} else {
|
} else {
|
||||||
for l in ¶ms.lifetimes {
|
for l in ¶ms.lifetimes {
|
||||||
self.visit_lifetime(l);
|
self.visit_lifetime(l);
|
||||||
|
|
@ -1803,14 +1803,24 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_elided_lifetimes(&mut self, lifetime_refs: &'tcx [hir::Lifetime]) {
|
fn resolve_elided_lifetimes(&mut self, lifetime_refs: &'tcx [hir::Lifetime], deprecated: bool) {
|
||||||
if lifetime_refs.is_empty() {
|
if lifetime_refs.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let span = lifetime_refs[0].span;
|
let span = lifetime_refs[0].span;
|
||||||
|
let id = lifetime_refs[0].id;
|
||||||
let mut late_depth = 0;
|
let mut late_depth = 0;
|
||||||
let mut scope = self.scope;
|
let mut scope = self.scope;
|
||||||
|
if deprecated {
|
||||||
|
self.tcx
|
||||||
|
.struct_span_lint_node(
|
||||||
|
lint::builtin::ELIDED_LIFETIME_IN_PATH,
|
||||||
|
id,
|
||||||
|
span,
|
||||||
|
&format!("hidden lifetime parameters are deprecated, try `Foo<'_>`"))
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
let error = loop {
|
let error = loop {
|
||||||
match *scope {
|
match *scope {
|
||||||
// Do not assign any resolution, it will be inferred.
|
// Do not assign any resolution, it will be inferred.
|
||||||
|
|
|
||||||
19
src/test/ui/in-band-lifetimes/ellided-lifetimes.rs
Normal file
19
src/test/ui/in-band-lifetimes/ellided-lifetimes.rs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2018 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.
|
||||||
|
#![allow(warnings)]
|
||||||
|
#![allow(unused_variables, dead_code, unused, bad_style)]
|
||||||
|
#![deny(elided_lifetime_in_path)]
|
||||||
|
|
||||||
|
struct Foo<'a> { x: &'a u32 }
|
||||||
|
fn foo(x: &Foo) {
|
||||||
|
//~^ ERROR: hidden lifetime parameters are deprecated, try `Foo<'_>`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
14
src/test/ui/in-band-lifetimes/ellided-lifetimes.stderr
Normal file
14
src/test/ui/in-band-lifetimes/ellided-lifetimes.stderr
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
error: hidden lifetime parameters are deprecated, try `Foo<'_>`
|
||||||
|
--> $DIR/ellided-lifetimes.rs:15:12
|
||||||
|
|
|
||||||
|
15 | fn foo(x: &Foo) {
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
note: lint level defined here
|
||||||
|
--> $DIR/ellided-lifetimes.rs:12:9
|
||||||
|
|
|
||||||
|
12 | #![deny(elided_lifetime_in_path)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue