diff options
| author | Martin Fischer <martin@push-f.com> | 2021-11-24 17:57:31 +0100 | 
|---|---|---|
| committer | Martin Fischer <martin@push-f.com> | 2021-11-24 17:57:32 +0100 | 
| commit | 8179dfab311b5e9555e34e6f42e58b1d3a3a4e08 (patch) | |
| tree | c924bd0035b5b4c1cb2cba9c08376706e33db877 | |
| parent | 010d91946605b03db5975fa39c5c9b46ef4c985a (diff) | |
better error for associated types in supertraits
| -rw-r--r-- | src/lib.rs | 13 | ||||
| -rw-r--r-- | ui-tests/src/bin/supertrait.rs | 6 | ||||
| -rw-r--r-- | ui-tests/src/bin/supertrait.stderr | 5 | 
3 files changed, 24 insertions, 0 deletions
| @@ -104,6 +104,19 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream {      let mut blanket_impl_attrs = Vec::new();      let mut dyn_trait_attrs = Vec::new(); +    // just to provide a better error message +    for bound in trait_bounds(&original_trait.supertraits) { +        if let Some(assoc_type) = iter_path(&bound.path) +            .filter_map(filter_map_assoc_paths) +            .next() +        { +            return abort!( +                assoc_type.span(), +                "dynamize does not support associated types in supertraits" +            ); +        } +    } +      // FUTURE: use Vec::drain_filter once it's stable      let mut i = 0;      while i < original_trait.attrs.len() { diff --git a/ui-tests/src/bin/supertrait.rs b/ui-tests/src/bin/supertrait.rs new file mode 100644 index 0000000..1dc4127 --- /dev/null +++ b/ui-tests/src/bin/supertrait.rs @@ -0,0 +1,6 @@ +#[dynamize::dynamize] +trait Foo: Into<Self::X> { +    type X; +} + +fn main() {} diff --git a/ui-tests/src/bin/supertrait.stderr b/ui-tests/src/bin/supertrait.stderr new file mode 100644 index 0000000..ebb1561 --- /dev/null +++ b/ui-tests/src/bin/supertrait.stderr @@ -0,0 +1,5 @@ +error: dynamize does not support associated types in supertraits + --> src/bin/supertrait.rs:2:17 +  | +2 | trait Foo: Into<Self::X> { +  |                 ^^^^ | 
