diff --git a/src/expand.rs b/src/expand.rs index cfaa11c..573ad1d 100644 --- a/src/expand.rs +++ b/src/expand.rs @@ -192,10 +192,14 @@ fn transform_sig( Some(colon_token) => colon_token.span, None => param_name.span(), }; - let bounds = mem::take(&mut param.bounds); - where_clause_or_default(&mut sig.generics.where_clause) - .predicates - .push(parse_quote_spanned!(span=> #param_name: 'async_trait + #bounds)); + if param.attrs.is_empty() { + let bounds = mem::take(&mut param.bounds); + where_clause_or_default(&mut sig.generics.where_clause) + .predicates + .push(parse_quote_spanned!(span=> #param_name: 'async_trait + #bounds)); + } else { + param.bounds.push(parse_quote!('async_trait)); + } } GenericParam::Lifetime(param) => { let param_name = ¶m.lifetime; @@ -203,10 +207,14 @@ fn transform_sig( Some(colon_token) => colon_token.span, None => param_name.span(), }; - let bounds = mem::take(&mut param.bounds); - where_clause_or_default(&mut sig.generics.where_clause) - .predicates - .push(parse_quote_spanned!(span=> #param: 'async_trait + #bounds)); + if param.attrs.is_empty() { + let bounds = mem::take(&mut param.bounds); + where_clause_or_default(&mut sig.generics.where_clause) + .predicates + .push(parse_quote_spanned!(span=> #param: 'async_trait + #bounds)); + } else { + param.bounds.push(parse_quote!('async_trait)); + } } GenericParam::Const(_) => {} } diff --git a/tests/test.rs b/tests/test.rs index 1772e75..0b6a322 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1705,3 +1705,24 @@ pub mod issue283 { } } } + +// https://github.com/dtolnay/async-trait/issues/288 +pub mod issue288 { + use async_trait::async_trait; + + #[async_trait] + pub trait Trait { + async fn f<#[cfg(any())] T: Send>(#[cfg(any())] t: T); + async fn g<#[cfg(all())] T: Send>(#[cfg(all())] t: T); + } + + pub struct Struct; + + #[async_trait] + impl Trait for Struct { + async fn f<#[cfg(any())] T: Send>(#[cfg(any())] t: T) {} + async fn g<#[cfg(all())] T: Send>(#[cfg(all())] t: T) { + let _ = t; + } + } +}