From 1eb43101001e40c36e4b82d64697b78a839e8955 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 27 Aug 2024 13:30:03 -0500 Subject: [PATCH] Simplify trait bounds for interface implementations --- crates/libs/bindgen/src/rust/implements.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/crates/libs/bindgen/src/rust/implements.rs b/crates/libs/bindgen/src/rust/implements.rs index 34359e4a00..380c527c2d 100644 --- a/crates/libs/bindgen/src/rust/implements.rs +++ b/crates/libs/bindgen/src/rust/implements.rs @@ -45,7 +45,9 @@ pub fn writer(writer: &Writer, def: metadata::TypeDef) -> TokenStream { let mut matches = quote! { iid == &<#type_ident as windows_core::Interface>::IID }; if let Some(metadata::Type::TypeDef(def, _)) = vtables.last() { - requires.combine(&gen_required_trait(writer, *def, &[])) + requires.combine(&gen_required_trait(writer, *def, &[])); + } else if has_unknown_base { + requires.combine("e! { + windows_core::IUnknownImpl }); } for def in &vtables { @@ -99,11 +101,9 @@ pub fn writer(writer: &Writer, def: metadata::TypeDef) -> TokenStream { quote! { unsafe extern "system" fn #name< #constraints - Identity: windows_core::IUnknownImpl, + Identity: #impl_ident<#generic_names>, const OFFSET: isize > #vtbl_signature - where - Identity: #impl_ident<#generic_names> { // offset the `this` pointer by `OFFSET` times the size of a pointer and cast it as an IUnknown implementation let this: &Identity = &*((this as *const *const ()).offset(OFFSET) as *const Identity); @@ -158,11 +158,9 @@ pub fn writer(writer: &Writer, def: metadata::TypeDef) -> TokenStream { #features impl<#constraints> #vtbl_ident<#generic_names> { pub const fn new< - Identity: windows_core::IUnknownImpl, + Identity: #impl_ident<#generic_names>, const OFFSET: isize >() -> #vtbl_ident<#generic_names> - where - Identity : #impl_ident<#generic_names> { #(#method_impls)* Self{