Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reject specialized Drop impls. #23638

Merged
merged 11 commits into from
Mar 25, 2015

Commits on Mar 24, 2015

  1. Remove unnecessary bounds from Drop impl for Arc and arc::Weak and

    one of the helper method impls.
    pnkfelix committed Mar 24, 2015
    Configuration menu
    Copy the full SHA
    5fa4b4c View commit details
    Browse the repository at this point in the history
  2. Added T:Send bound to sync::mpsc::Receiver and sync::mpsc::Sender.

    This was necessary to avoid specialized `Drop` impls for the two structs.
    pnkfelix committed Mar 24, 2015
    Configuration menu
    Copy the full SHA
    0adab50 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    26a79e3 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    1249e60 View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    1e71d2e View commit details
    Browse the repository at this point in the history
  6. Configuration menu
    Copy the full SHA
    018eeb7 View commit details
    Browse the repository at this point in the history
  7. Configuration menu
    Copy the full SHA
    123b5c1 View commit details
    Browse the repository at this point in the history
  8. Configuration menu
    Copy the full SHA
    5f57fd5 View commit details
    Browse the repository at this point in the history
  9. Configuration menu
    Copy the full SHA
    290c8de View commit details
    Browse the repository at this point in the history
  10. Reject specialized Drop impls.

    See Issue 8142 for discussion.
    
    This makes it illegal for a Drop impl to be more specialized than the
    original item.
    
    So for example, all of the following are now rejected (when they would
    have been blindly accepted before):
    
    ```rust
    struct S<A> { ... };
    impl Drop for S<i8> { ... } // error: specialized to concrete type
    
    struct T<'a> { ... };
    impl Drop for T<'static> { ... } // error: specialized to concrete region
    
    struct U<A> { ... };
    impl<A:Clone> Drop for U<A> { ... } // error: added extra type requirement
    
    struct V<'a,'b>;
    impl<'a,'b:a> Drop for V<'a,'b> { ... } // error: added extra region requirement
    ```
    
    Due to examples like the above, this is a [breaking-change].
    
    (The fix is to either remove the specialization from the `Drop` impl,
    or to transcribe the requirements into the struct/enum definition;
    examples of both are shown in the PR's fixed to `libstd`.)
    
    ----
    
    This is likely to be the last thing blocking the removal of the
    `#[unsafe_destructor]` attribute.
    
    Includes two new error codes for the new dropck check.
    
    Update run-pass tests to accommodate new dropck pass.
    
    Update tests and docs to reflect new destructor restriction.
    
    ----
    
    Implementation notes:
    
    We identify Drop impl specialization by not being as parametric as the
    struct/enum definition via unification.
    
    More specifically:
    
     1. Attempt unification of a skolemized instance of the struct/enum
        with an instance of the Drop impl's type expression where all of
        the impl's generics (i.e. the free variables of the type
        expression) have been replaced with unification variables.
    
     2. If unification fails, then reject Drop impl as specialized.
    
     3. If unification succeeds, check if any of the skolemized
        variables "leaked" into the constraint set for the inference
        context; if so, then reject Drop impl as specialized.
    
     4. Otherwise, unification succeeded without leaking skolemized
        variables: accept the Drop impl.
    
    We identify whether a Drop impl is injecting new predicates by simply
    looking whether the predicate, after an appropriate substitution,
    appears on the struct/enum definition.
    pnkfelix committed Mar 24, 2015
    Configuration menu
    Copy the full SHA
    5b2e869 View commit details
    Browse the repository at this point in the history
  11. Configuration menu
    Copy the full SHA
    1955e05 View commit details
    Browse the repository at this point in the history