Skip to content

Commit

Permalink
Detect non-static lifetime behind reference type parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Dec 27, 2020
1 parent cb3077c commit 0859205
Showing 1 changed file with 22 additions and 15 deletions.
37 changes: 22 additions & 15 deletions impl/src/valid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ fn check_field_attrs(fields: &[Field]) -> Result<()> {
}
}
if let Some(source_field) = source_field.or(from_field) {
if contains_non_static_lifetime(source_field) {
if contains_non_static_lifetime(&source_field.ty) {
return Err(Error::new_spanned(
&source_field.original.ty,
"non-static lifetimes are not allowed in the source of an error, because std::error::Error requires the source is dyn Error + 'static",
Expand All @@ -206,21 +206,28 @@ fn same_member(one: &Field, two: &Field) -> bool {
}
}

fn contains_non_static_lifetime(field: &Field) -> bool {
let ty = match field.ty {
Type::Path(ty) => ty,
_ => return false, // maybe implement later if there are common other cases
};
let bracketed = match &ty.path.segments.last().unwrap().arguments {
PathArguments::AngleBracketed(bracketed) => bracketed,
_ => return false,
};
for arg in &bracketed.args {
if let GenericArgument::Lifetime(lifetime) = arg {
if lifetime.ident != "static" {
return true;
fn contains_non_static_lifetime(ty: &Type) -> bool {
match ty {
Type::Path(ty) => {
let bracketed = match &ty.path.segments.last().unwrap().arguments {
PathArguments::AngleBracketed(bracketed) => bracketed,
_ => return false,
};
for arg in &bracketed.args {
match arg {
GenericArgument::Type(ty) if contains_non_static_lifetime(ty) => return true,
GenericArgument::Lifetime(lifetime) if lifetime.ident != "static" => {
return true
}
_ => {}
}
}
false
}
Type::Reference(ty) => ty
.lifetime
.as_ref()
.map_or(false, |lifetime| lifetime.ident != "static"),
_ => false, // maybe implement later if there are common other cases
}
false
}

0 comments on commit 0859205

Please sign in to comment.