Commit Graph

36318 Commits

Author SHA1 Message Date
Huon Wilson
3c1ca175d1 Require that types cannot implement both Drop and Copy.
Opt-in built-in traits allowed one to explicitly implement both `Drop`
and `Copy` for a type. This can theoretically make some sense, but the
current implementation means it is codegened totally incorrectly which
can lead to memory unsafety, so this feature is disabled for now.

Fixes #20126.
2015-01-08 10:07:07 +11:00
bors
c7dd3c4d69 auto merge of #20578 : japaric/rust/no-more-bc, r=nmatsakis
This PR removes boxed closures from the language, the closure type syntax (`let f: |int| -> bool = /* ... */`) has been obsoleted. Move all your uses of closures to the new unboxed closure system (i.e. `Fn*` traits).

[breaking-change] patterns

- `lef f = || {}`

This binding used to type check to a boxed closure. Now that boxed closures are gone, you need to annotate the "kind" of the unboxed closure, i.e. you need pick one of these: `|&:| {}`, `|&mut:| {}` or `|:| {}`.

In the (near) future we'll have closure "kind" inference, so the compiler will infer which `Fn*` trait to use based on how the closure is used. Once this inference machinery is in place, we'll be able to remove the kind annotation from most closures.

- `type Alias<'a> = |int|:'a -> bool`

Use a trait object: `type Alias<'a> = Box<FnMut(int) -> bool + 'a>`. Use the `Fn*` trait that makes sense for your use case.

- `fn foo(&self, f: |uint| -> bool)`

In this case you can use either a trait object or an unboxed closure:

``` rust
fn foo(&self, f: F) where F: FnMut(uint) -> bool;
// or
fn foo(&self, f: Box<FnMut(uint) -> bool>);
```

- `struct Struct<'a> { f: |uint|:'a -> bool }`

Again, you can use either a trait object or an unboxed closure:

``` rust
struct Struct<F> where F: FnMut(uint) -> bool { f: F }
// or
struct Struct<'a> { f: Box<FnMut(uint) -> bool + 'a> }
```

- Using `|x, y| f(x, y)` for closure "borrows"

This comes up in recursive functions, consider the following (contrived) example:

``` rust
fn foo(x: uint, f: |uint| -> bool) -> bool {
    //foo(x / 2, f) && f(x)  // can't use this because `f` gets moved away in the `foo` call
    foo(x / 2, |x| f(x)) && f(x)  // instead "borrow" `f` in the `foo` call
}
```

If you attempt to do the same with unboxed closures you'll hit ""error: reached the recursion limit during monomorphization" (see #19596):

``` rust
fn foo<F>(x: uint, mut f: F) -> bool where F: FnMut(uint) -> bool {
    foo(x / 2, |x| f(x)) && f(x)
    //~^ error: reached the recursion limit during monomorphization
}
```

Instead you *should* be able to write this:

``` rust
fn foo<F>(x: uint, mut f: F) -> bool where F: FnMut(uint) -> bool {
    foo(x / 2, &mut f) && f(x)
    //~^ error: the trait `FnMut` is not implemented for the type `&mut F`
}
```

But as you see above `&mut F` doesn't implement the `FnMut` trait. `&mut F` *should* implement the `FnMut` and the above code *should* work, but due to a bug (see #18835) it doesn't (for now).

You can work around the issue by rewriting the function to take `&mut F` instead of `F`:

``` rust
fn foo<F>(x: uint, f: &mut F) -> bool where F: FnMut(uint) -> bool {
    foo(x / 2, f) && (*f)(x)
}
```

This finally works! However writing `foo(0, &mut |x| x == 0)` is unergonomic. So you can use a private helper function to avoid this:

``` rust
// public API function
pub fn foo<F>(x: uint, mut f: F) -> bool where F: FnMut(uint) -> bool {
    foo_(x, &mut f)
}

// private helper function
fn foo_<F>(x: uint, f: &mut F) -> bool where F: FnMut(uint) -> bool {
    foo_(x / 2, f) && (*f)(x)
}
```

Closes #14798

---

There is more cleanup to do: like renaming functions/types from `unboxed_closure` to just `closure`, removing more dead code, simplify functions which now have unused arguments, update the documentation, etc. But that can be done in another PR.

r? @nikomatsakis @aturon (You probably want to focus on the deleted/modified tests.)
cc @eddyb
2015-01-05 23:51:00 +00:00
Jorge Aparicio
eb2506cc1b remove more stage0 stuff 2015-01-05 17:22:18 -05:00
Jorge Aparicio
97f870a1fc unignore and fix doctests in guide and reference 2015-01-05 17:22:18 -05:00
Jorge Aparicio
a55011e788 fix tests 2015-01-05 17:22:18 -05:00
Jorge Aparicio
ec11f66dbf replace f.call_mut(a, b, ..) with f(a, b, ..) 2015-01-05 17:22:18 -05:00
Niko Matsakis
c98814b124 Correctly "detuple" arguments when creating trait object shims for a trait method with rust-call ABI. 2015-01-05 17:22:18 -05:00
Niko Matsakis
f97b124a44 Fix ICE caused by forgotten bcx 2015-01-05 17:22:18 -05:00
Jorge Aparicio
79af277623 address Niko's comments 2015-01-05 17:22:17 -05:00
Jorge Aparicio
ab0c7af376 ignore boxed closure doctests in the guide/reference 2015-01-05 17:22:17 -05:00
Jorge Aparicio
a9ea4d0127 fix benchmarks 2015-01-05 17:22:17 -05:00
Jorge Aparicio
ef726591f8 fix debuginfo tests 2015-01-05 17:22:17 -05:00
Jorge Aparicio
1bbeb37582 fix pretty tests 2015-01-05 17:22:17 -05:00
Jorge Aparicio
d6a948e8f4 fix run-make test 2015-01-05 17:22:17 -05:00
Jorge Aparicio
7d5b0454e9 fix cfail tests 2015-01-05 17:22:17 -05:00
Jorge Aparicio
ca17d08126 fix rpass tests 2015-01-05 17:22:16 -05:00
Jorge Aparicio
8d0d7521d6 typeck: remove dead code 2015-01-05 17:22:16 -05:00
Jorge Aparicio
643826150b trans: remove dead code 2015-01-05 17:22:16 -05:00
Jorge Aparicio
5d6a6f5957 rustc: remove dead code 2015-01-05 17:22:16 -05:00
Jorge Aparicio
799332fa3f syntax: remove dead code 2015-01-05 17:22:16 -05:00
Jorge Aparicio
f258ee7d96 typeck: there are only unboxed closures now 2015-01-05 17:22:16 -05:00
Jorge Aparicio
58b0d7479f syntax: make the closure type f: |uint| -> bool syntax obsolete 2015-01-05 17:22:16 -05:00
Jorge Aparicio
865aabb662 trans: remove Closure 2015-01-05 17:22:15 -05:00
Jorge Aparicio
8a6d7a68b1 remove mk_closure 2015-01-05 17:22:15 -05:00
Jorge Aparicio
4e9c50e081 remove AdjustAddEnv 2015-01-05 17:22:15 -05:00
Jorge Aparicio
714a5b7f5e remove TyClosure 2015-01-05 17:22:15 -05:00
Jorge Aparicio
5f7f2c9a05 remove ty_closure 2015-01-05 17:22:15 -05:00
Jorge Aparicio
18e2026ff8 coretest: remove/ignore tests 2015-01-05 17:22:15 -05:00
Jorge Aparicio
37448506ea compiletest: remove boxed closures 2015-01-05 17:22:14 -05:00
Jorge Aparicio
b4ccc90166 driver: remove unboxed closures 2015-01-05 17:22:14 -05:00
Jorge Aparicio
bf52e262e2 trans: remove remaining boxed closures 2015-01-05 17:22:14 -05:00
Jorge Aparicio
977e151b9a typeck: remove remaining boxed closures 2015-01-05 17:22:14 -05:00
Jorge Aparicio
8570f0acc7 rustc: remove remaining boxed closures 2015-01-05 17:22:13 -05:00
Jorge Aparicio
0cb34a3609 EncodeInlinedItem: convert to "unboxed" closures 2015-01-05 17:22:13 -05:00
Jorge Aparicio
bd9eef7ac6 DecodeInlinedItem: convert to "unboxed" closures 2015-01-05 17:22:13 -05:00
Jorge Aparicio
98fda878d8 conv_did: convert to "unboxed" closure 2015-01-05 17:22:12 -05:00
Jorge Aparicio
07a8e7cfb5 syntax: remove remaining boxed closures 2015-01-05 17:22:12 -05:00
Jorge Aparicio
37f62ae1c0 std: remove remaining boxed closures 2015-01-05 17:22:12 -05:00
Jorge Aparicio
a291a80fbe register snapshot 2015-01-05 17:22:11 -05:00
bors
f11f3e7bae auto merge of #20572 : nikomatsakis/rust/assoc-supertrait-stuff, r=brson
The first few commits in the PR are just general refactoring. I was intending them for some other code I didn't get around to writing yet, but might as well land them now. 

cc @japaric

Fixes #19541
2015-01-05 20:02:14 +00:00
bors
03268bbf35 auto merge of #20514 : alexcrichton/rust/serialize-associated-type, r=aturon
This commit moves the libserialize crate (and will force the hand of the
rustc-serialize crate) to not require the `old_orphan_check` feature gate as
well as using associated types wherever possible. Concretely, the following
changes were made:

* The error type of `Encoder` and `Decoder` is now an associated type, meaning
  that these traits have no type parameters.

* The `Encoder` and `Decoder` type parameters on the `Encodable` and `Decodable`
  traits have moved to the corresponding method of the trait. This movement
  alleviates the dependency on `old_orphan_check` but implies that
  implementations can no longer be specialized for the type of encoder/decoder
  being implemented.

Due to the trait definitions changing, this is a:

[breaking-change]
2015-01-05 14:51:03 +00:00
Niko Matsakis
928bb2be8f Improve test to include a projection, per @huonw's suggestion. 2015-01-05 09:14:03 -05:00
Niko Matsakis
57aaa9bf87 Make supertrait references work in object types too. 2015-01-05 07:11:48 -05:00
Niko Matsakis
7ee5863202 Minor code formatting cleanups. 2015-01-05 07:11:48 -05:00
Niko Matsakis
9989288438 Permit bindings of (and references to) associated types defined in supertraits. 2015-01-05 07:11:48 -05:00
Niko Matsakis
2ccab193af Introduce a CollectCtxt and impl AstConv on *that*. Also make all fns
in collect private except the public entry point.
2015-01-05 07:11:47 -05:00
Niko Matsakis
95ee339bd1 Stop writing code that is (unnecessarily) generic over any AstConv in collect,
just hard-code the ccx.
2015-01-05 07:11:47 -05:00
Niko Matsakis
94c345b66c Convert astconv and friends to use object types, not generics. No need to compile
all that stuff twice. Also, code reads so much nicer.
2015-01-05 07:11:47 -05:00
bors
8e83af6e87 auto merge of #20451 : brson/rust/installer, r=alexcrichton
This fixes a mostly harmless syntax error in the install script.
2015-01-05 11:10:57 +00:00
Alex Crichton
0cb7a4062a serialize: Use assoc types + less old_orphan_check
This commit moves the libserialize crate (and will force the hand of the
rustc-serialize crate) to not require the `old_orphan_check` feature gate as
well as using associated types wherever possible. Concretely, the following
changes were made:

* The error type of `Encoder` and `Decoder` is now an associated type, meaning
  that these traits have no type parameters.

* The `Encoder` and `Decoder` type parameters on the `Encodable` and `Decodable`
  traits have moved to the corresponding method of the trait. This movement
  alleviates the dependency on `old_orphan_check` but implies that
  implementations can no longer be specialized for the type of encoder/decoder
  being implemented.

Due to the trait definitions changing, this is a:

[breaking-change]
2015-01-04 22:59:26 -08:00