diff options
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | src/lib.rs | 10 | ||||
-rw-r--r-- | tests/doctests.md | 19 |
3 files changed, 30 insertions, 1 deletions
@@ -20,7 +20,7 @@ let object = &client as &dyn Client; The last line of the above code fails to compile with: -> error[E0191]: the value of the associated type `Error` (from trait `Client`) +> error\[E0191\]: the value of the associated type `Error` (from trait `Client`) > must be specified Sometimes you however want a trait object to be able to encompass trait @@ -308,12 +308,18 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream { let blanket_impl = generate_blanket_impl(&dyn_trait, &original_trait, &method_impls); + let dyn_trait_name = &dyn_trait.ident; + let (impl_generics, ty_generics, where_clause) = dyn_trait.generics.split_for_impl(); + let expanded = quote! { #original_trait #(#dyn_trait_attrs)* #dyn_trait + // assert that dyn_trait can actually be made into an object + impl #impl_generics dyn #dyn_trait_name #ty_generics #where_clause {} + #(#blanket_impl_attrs)* #blanket_impl }; @@ -432,3 +438,7 @@ fn path_segment_for_trait(sometrait: &ItemTrait) -> PathSegment { }, } } + +#[doc = include_str!("../tests/doctests.md")] +#[cfg(doctest)] +struct Doctests; diff --git a/tests/doctests.md b/tests/doctests.md new file mode 100644 index 0000000..ef557fe --- /dev/null +++ b/tests/doctests.md @@ -0,0 +1,19 @@ +Tests that the object-safety assertion via `impl dyn` is working: + +```rust compile_fail +trait ObjectUnsafe: Sized {} + +#[dynamize::dynamize] +trait Trait: ObjectUnsafe {} +``` + +```rust compile_fail +trait ObjectUnsafe: Sized {} + +#[dynamize::dynamize] +trait Trait { + type A: ObjectUnsafe; + + fn f(&self) -> Self::A; +} +``` |