• A
    Generate documentation for auto-trait impls · 6728f21d
    Aaron Hill 提交于
    A new section is added to both both struct and trait doc pages.
    
    On struct/enum pages, a new 'Auto Trait Implementations' section displays any
    synthetic implementations for auto traits. Currently, this is only done
    for Send and Sync.
    
    On trait pages, a new 'Auto Implementors' section displays all types
    which automatically implement the trait. Effectively, this is a list of
    all public types in the standard library.
    
    Synthesized impls for a particular auto trait ('synthetic impls') take
    into account generic bounds. For example, a type 'struct Foo<T>(T)' will
    have 'impl<T> Send for Foo<T> where T: Send' generated for it.
    
    Manual implementations of auto traits are also taken into account. If we have
    the following types:
    
    'struct Foo<T>(T)'
    'struct Wrapper<T>(Foo<T>)'
    'unsafe impl<T> Send for Wrapper<T>' // pretend that Wrapper<T> makes
    this sound somehow
    
    Then Wrapper will have the following impl generated:
    'impl<T> Send for Wrapper<T>'
    reflecting the fact that 'T: Send' need not hold for 'Wrapper<T>: Send'
    to hold
    
    Lifetimes, HRTBS, and projections (e.g. '<T as Iterator>::Item') are
    taken into account by synthetic impls
    
    However, if a type can *never* implement a particular auto trait
    (e.g. 'struct MyStruct<T>(*const T)'), then a negative impl will be
    generated (in this case, 'impl<T> !Send for MyStruct<T>')
    
    All of this means that a user should be able to copy-paste a synthetic
    impl into their code, without any observable changes in behavior
    (assuming the rest of the program remains unchanged).
    6728f21d
doctree.rs 7.2 KB