Skip to content

Commit

Permalink
Rollup merge of rust-lang#45166 - tinaun:more_unstable_docs, r=stevek…
Browse files Browse the repository at this point in the history
…labnik

Documented a few more unstable feature gates.

unboxed closures, fn_traits, and OIBIT. hope these are decent!
  • Loading branch information
kennytm authored Oct 11, 2017
2 parents b3b3b6a + d5ef9f9 commit 1faf129
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# `optin_builtin_traits`

The tracking issue for this feature is [#13231]

[#13231]: https://github.com/rust-lang/rust/issues/13231

----

The `optin_builtin_traits` feature gate allows you to define auto traits.

Auto traits, like [`Send`] or [`Sync`] in the standard library, are marker traits
that are automatically implemented for every type, unless the type, or a type it contains,
has explictly opted out via a negative impl.

[`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html
[`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html

```rust,ignore
impl !Type for Trait
```

Example:

```rust
#![feature(optin_builtin_traits)]

trait Valid {}

impl Valid for .. {}

struct True;
struct False;

impl !Valid for False {}

struct MaybeValid<T>(T);

fn must_be_valid<T: Valid>(_t: T) { }

fn main() {
// works
must_be_valid( MaybeValid(True) );

// compiler error - trait bound not satisfied
// must_be_valid( MaybeValid(False) );
}
```
25 changes: 25 additions & 0 deletions src/doc/unstable-book/src/language-features/unboxed-closures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# `unboxed_closures`

The tracking issue for this feature is [#29625]

See Also: [`fn_traits`](library-features/fn-traits.html)

[#29625]: https://github.com/rust-lang/rust/issues/29625

----

The `unboxed_closures` feature allows you to write functions using the `"rust-call"` ABI,
required for implmenting the [`Fn*`] family of traits. `"rust-call"` functions must have
exactly one (non self) argument, a tuple representing the argument list.

[`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html

```rust
#![feature(unboxed_closures)]

extern "rust-call" fn add_args(args: (u32, u32)) -> u32 {
args.0 + args.1
}

fn main() {}
```
35 changes: 35 additions & 0 deletions src/doc/unstable-book/src/library-features/fn-traits.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# `fn_traits`

The tracking issue for this feature is [#29625]

See Also: [`unboxed_closures`](language-features/unboxed-closures.html)

[#29625]: https://github.com/rust-lang/rust/issues/29625

----

The `fn_traits` feature allows for implementation of the [`Fn*`] traits
for creating custom closure-like types.

[`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html

```rust
#![feature(unboxed_closures)]
#![feature(fn_traits)]

struct Adder {
a: u32
}

impl FnOnce<(u32, )> for Adder {
type Output = u32;
extern "rust-call" fn call_once(self, b: (u32, )) -> Self::Output {
self.a + b.0
}
}

fn main() {
let adder = Adder { a: 3 };
assert_eq!(adder(2), 5);
}
```

0 comments on commit 1faf129

Please sign in to comment.