]> git.lizzy.rs Git - rust.git/commit
Fix orphan checking (cc #19470). (This is not a complete fix of #19470 because of...
authorNiko Matsakis <niko@alum.mit.edu>
Fri, 26 Dec 2014 08:30:51 +0000 (03:30 -0500)
committerNiko Matsakis <niko@alum.mit.edu>
Fri, 2 Jan 2015 09:06:09 +0000 (04:06 -0500)
commitc61a0092bc236c4be4cb691fcd50ff50e91ab0d6
tree6cd9026ea34772769ad89d5c78fe4d55cf8b98cb
parent77723d24a831f9a062e210cc964e4849c23df116
Fix orphan checking (cc #19470). (This is not a complete fix of #19470 because of the backwards compatibility feature gate.)

This is a [breaking-change]. The new rules require that, for an impl of a trait defined
in some other crate, two conditions must hold:

1. Some type must be local.
2. Every type parameter must appear "under" some local type.

Here are some examples that are legal:

```rust
struct MyStruct<T> { ... }

// Here `T` appears "under' `MyStruct`.
impl<T> Clone for MyStruct<T> { }

// Here `T` appears "under' `MyStruct` as well. Note that it also appears
// elsewhere.
impl<T> Iterator<T> for MyStruct<T> { }
```

Here is an illegal example:

```rust
// Here `U` does not appear "under" `MyStruct` or any other local type.
// We call `U` "uncovered".
impl<T,U> Iterator<U> for MyStruct<T> { }
```

There are a couple of ways to rewrite this last example so that it is
legal:

1. In some cases, the uncovered type parameter (here, `U`) should be converted
   into an associated type. This is however a non-local change that requires access
   to the original trait. Also, associated types are not fully baked.
2. Add `U` as a type parameter of `MyStruct`:
   ```rust
   struct MyStruct<T,U> { ... }
   impl<T,U> Iterator<U> for MyStruct<T,U> { }
   ```
3. Create a newtype wrapper for `U`
   ```rust
   impl<T,U> Iterator<Wrapper<U>> for MyStruct<T,U> { }
   ```

Because associated types are not fully baked, which in the case of the
`Hash` trait makes adhering to this rule impossible, you can
temporarily disable this rule in your crate by using
`#![feature(old_orphan_check)]`. Note that the `old_orphan_check`
feature will be removed before 1.0 is released.
26 files changed:
src/liballoc/lib.rs
src/libcollections/lib.rs
src/libgraphviz/maybe_owned_vec.rs
src/librustc/lib.rs
src/librustc/middle/traits/coherence.rs
src/librustc/middle/traits/mod.rs
src/librustc_back/lib.rs
src/librustc_borrowck/lib.rs
src/librustc_trans/lib.rs
src/librustc_typeck/coherence/orphan.rs
src/librustdoc/lib.rs
src/libserialize/json.rs
src/libstd/lib.rs
src/libsyntax/feature_gate.rs
src/libsyntax/lib.rs
src/libtest/lib.rs
src/libtime/lib.rs
src/test/compile-fail/opt-out-copy-bad.rs
src/test/run-pass/deriving-encodable-decodable-box.rs
src/test/run-pass/deriving-encodable-decodable-cell-refcell.rs
src/test/run-pass/deriving-global.rs
src/test/run-pass/issue-11881.rs
src/test/run-pass/issue-14021.rs
src/test/run-pass/issue-15734.rs
src/test/run-pass/issue-3743.rs
src/test/run-pass/overloaded-calls-param-vtables.rs