- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.9k
Closed
Description
STR
trait Trait {}
// OK
#[deriving(Show)]
struct Foo<T: Trait> {
    foo: T,
}
#[deriving(Show)]
//~^ error: the trait `Trait` is not implemented for the type `T`
struct Bar<T> where T: Trait {
    bar: T,
}
fn main() {}Output
If you check the --pretty=expanded output,  you'll notice the T: Trait bound is missing in the Bar case.
// OK
struct Foo<T: Trait> {
    foo: T,
}
#[automatically_derived]
impl <T: ::std::fmt::Show + Trait> ::std::fmt::Show for Foo<T> {
    fn fmt(&self, __arg_0: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
        match *self {
            Foo { foo: ref __self_0_0 } =>
            match (&(*__self_0_0),) {
                (__arg0,) => {
                    #[inline]
                    #[allow(dead_code)]
                    static __STATIC_FMTSTR: &'static [&'static str] =
                        &["Foo { foo: ", " }"];
                    let __args_vec =
                        &[::std::fmt::argument(::std::fmt::Show::fmt,
                                               __arg0)];
                    let __args =
                        unsafe {
                            ::std::fmt::Arguments::new(__STATIC_FMTSTR,
                                                       __args_vec)
                        };
                    __arg_0.write_fmt(&__args)
                }
            },
        }
    }
}
//~^ error: the trait `Trait` is not implemented for the type `T`
struct Bar<T> {
    bar: T,
}
#[automatically_derived]
impl <T: ::std::fmt::Show> ::std::fmt::Show for Bar<T> {
    fn fmt(&self, __arg_0: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
        match *self {
            Bar { bar: ref __self_0_0 } =>
            match (&(*__self_0_0),) {
                (__arg0,) => {
                    #[inline]
                    #[allow(dead_code)]
                    static __STATIC_FMTSTR: &'static [&'static str] =
                        &["Bar { bar: ", " }"];
                    let __args_vec =
                        &[::std::fmt::argument(::std::fmt::Show::fmt,
                                               __arg0)];
                    let __args =
                        unsafe {
                            ::std::fmt::Arguments::new(__STATIC_FMTSTR,
                                                       __args_vec)
                        };
                    __arg_0.write_fmt(&__args)
                }
            },
        }
    }
}
fn main() { }Version
rustc 0.13.0-dev (8fb027e39 2014-11-26 12:02:16 +0000)The possible solution would be to make the deriving syntax extension also copy the where clause bounds into the expanded impl, just like  it already does for the "inline bounds" impl<T: Show + Trait> ....
Metadata
Metadata
Assignees
Labels
No labels