Skip to content

Commit

Permalink
Rollup merge of rust-lang#64603 - gilescope:unused-lifetime-warning, …
Browse files Browse the repository at this point in the history
…r=matthewjasper

Reducing spurious unused lifetime warnings.

Fixes rust-lang#61115, fixes rust-lang#64493.
  • Loading branch information
Centril authored Oct 15, 2019
2 parents 237d54f + d82c1c5 commit c1f51b6
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/librustc/middle/resolve_lifetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -708,15 +708,22 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
match param.kind {
GenericParamKind::Lifetime { .. } => {
let (name, reg) = Region::early(&self.tcx.hir(), &mut index, &param);
let def_id = if let Region::EarlyBound(_ ,def_id , _) = reg {
def_id
} else {
bug!();
};
if let hir::ParamName::Plain(param_name) = name {
if param_name.name == kw::UnderscoreLifetime {
// Pick the elided lifetime "definition" if one exists
// and use it to make an elision scope.
self.lifetime_uses.insert(def_id.clone(), LifetimeUseSet::Many);
elision = Some(reg);
} else {
lifetimes.insert(name, reg);
}
} else {
self.lifetime_uses.insert(def_id.clone(), LifetimeUseSet::Many);
lifetimes.insert(name, reg);
}
}
Expand Down Expand Up @@ -1615,7 +1622,6 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
_ => None,
} {
debug!("id = {:?} span = {:?} name = {:?}", id, span, name);

if name.name == kw::UnderscoreLifetime {
continue;
}
Expand Down
42 changes: 42 additions & 0 deletions src/test/ui/async-await/unused-lifetime.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// edition:2018

// Avoid spurious warnings of unused lifetime. The below async functions
// are desugered to have an unused lifetime
// but we don't want to warn about that as there's nothing they can do about it.

#![deny(unused_lifetimes)]
#![allow(dead_code)]

pub async fn october(s: &str) {
println!("{}", s);
}

pub async fn async_fn(&mut ref s: &mut[i32]) {
println!("{:?}", s);
}

macro_rules! foo_macro {
() => {
pub async fn async_fn_in_macro(&mut ref _s: &mut[i32]) {}
};
}

foo_macro!();

pub async fn func_with_unused_lifetime<'a>(s: &'a str) {
//~^ ERROR lifetime parameter `'a` never used
println!("{}", s);
}

pub async fn func_with_two_unused_lifetime<'a, 'b>(s: &'a str, t: &'b str) {
//~^ ERROR lifetime parameter `'a` never used
//~^^ ERROR lifetime parameter `'b` never used
println!("{}", s);
}

pub async fn func_with_unused_lifetime_in_two_params<'c>(s: &'c str, t: &'c str) {
//~^ ERROR lifetime parameter `'c` never used
println!("{}", s);
}

fn main() {}
32 changes: 32 additions & 0 deletions src/test/ui/async-await/unused-lifetime.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
error: lifetime parameter `'a` never used
--> $DIR/unused-lifetime.rs:26:40
|
LL | pub async fn func_with_unused_lifetime<'a>(s: &'a str) {
| ^^
|
note: lint level defined here
--> $DIR/unused-lifetime.rs:7:9
|
LL | #![deny(unused_lifetimes)]
| ^^^^^^^^^^^^^^^^

error: lifetime parameter `'a` never used
--> $DIR/unused-lifetime.rs:31:44
|
LL | pub async fn func_with_two_unused_lifetime<'a, 'b>(s: &'a str, t: &'b str) {
| ^^

error: lifetime parameter `'b` never used
--> $DIR/unused-lifetime.rs:31:48
|
LL | pub async fn func_with_two_unused_lifetime<'a, 'b>(s: &'a str, t: &'b str) {
| ^^

error: lifetime parameter `'c` never used
--> $DIR/unused-lifetime.rs:37:54
|
LL | pub async fn func_with_unused_lifetime_in_two_params<'c>(s: &'c str, t: &'c str) {
| ^^

error: aborting due to 4 previous errors

0 comments on commit c1f51b6

Please sign in to comment.