From 2951949623b40708f0c56784a5bd270993da7e31 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 24 Jun 2022 01:20:33 +0000 Subject: [PATCH] Do not make `Deref` generic params always a `&T` for traits. We never expect traits to be passed by reference, so when using the new-style generic resolution, we shouldn't force all `Deref`s to `&T`, at least if the `T` is a trait. --- c-bindings-gen/src/types.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 2ea9221..5985521 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -283,14 +283,16 @@ impl<'a, 'p: 'a> GenericTypes<'a, 'p> { non_lifetimes_processed = true; assert_simple_bound(&trait_bound); let resolved = types.resolve_path(&trait_bound.path, None); - let ref_ty = syn::Type::Reference(syn::TypeReference { - and_token: syn::Token![&](Span::call_site()), - lifetime: None, mutability: None, - elem: Box::new(syn::Type::Path(syn::TypePath { - qself: None, path: string_path_to_syn_path(&resolved) - })), + let ty = syn::Type::Path(syn::TypePath { + qself: None, path: string_path_to_syn_path(&resolved) }); - self.default_generics.insert(p_ident, (ref_ty.clone(), ref_ty)); + let ref_ty = parse_quote!(&#ty); + if types.crate_types.traits.get(&resolved).is_some() { + self.default_generics.insert(p_ident, (ty, ref_ty)); + } else { + self.default_generics.insert(p_ident, (ref_ty.clone(), ref_ty)); + } + *gen = Some(resolved); } } -- 2.30.2