From 0c97d6c85550d795407a5c7cbaf6d1553c338b9d Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 20 May 2017 09:38:45 -0400 Subject: [PATCH 1/3] Add basic Unstable Book entry for `on_unimplemented`. --- .../src/language-features/on-unimplemented.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/doc/unstable-book/src/language-features/on-unimplemented.md b/src/doc/unstable-book/src/language-features/on-unimplemented.md index 81f284d0a6a..9eea3fccbbc 100644 --- a/src/doc/unstable-book/src/language-features/on-unimplemented.md +++ b/src/doc/unstable-book/src/language-features/on-unimplemented.md @@ -6,5 +6,42 @@ The tracking issue for this feature is: [#29628] ------------------------ +The `on_unimplemented` feature provides the `#[rustc_on_unimplemented]` +attribute, which allows trait definitions to add specialized notes to error +messages when an implementation was expected but not found. +For example: + +```rust,compile_fail +#![feature(on_unimplemented)] + +#[rustc_on_unimplemented="a collection of type `{Self}` cannot be built from an \ + iterator over elements of type `{A}`"] +trait MyIterator { + fn next(&mut self) -> A; +} + +fn iterate_chars>(i: I) { + // ... +} + +fn main() { + iterate_chars(&[1, 2, 3][..]); +} +``` + +When the user compiles this, they will see the following; + +```txt +error[E0277]: the trait bound `&[{integer}]: MyIterator` is not satisfied + --> :14:5 + | +14 | iterate_chars(&[1, 2, 3][..]); + | ^^^^^^^^^^^^^ the trait `MyIterator` is not implemented for `&[{integer}]` + | + = note: a collection of type `&[{integer}]` cannot be built from an iterator over elements of type `char` + = note: required by `iterate_chars` + +error: aborting due to previous error +``` From d1f499309979fb53f4fa6d791cbfac803431579d Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 20 May 2017 11:47:51 -0400 Subject: [PATCH 2/3] Add basic Unstable Book entry for `catch_expr`. --- .../src/language-features/catch-expr.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/doc/unstable-book/src/language-features/catch-expr.md b/src/doc/unstable-book/src/language-features/catch-expr.md index 44eb2a6dd4f..fbd213dca56 100644 --- a/src/doc/unstable-book/src/language-features/catch-expr.md +++ b/src/doc/unstable-book/src/language-features/catch-expr.md @@ -5,3 +5,26 @@ The tracking issue for this feature is: [#31436] [#31436]: https://github.com/rust-lang/rust/issues/31436 ------------------------ + +The `catch_expr` feature adds support for a `catch` expression. The `catch` +expression creates a new scope one can use the `?` operator in. + +```rust +#![feature(catch_expr)] + +use std::num::ParseIntError; + +let result: Result = do catch { + Ok("1".parse::()? + + "2".parse::()? + + "3".parse::()?) +}; +assert_eq!(result, Ok(6)); + +let result: Result = do catch { + Ok("1".parse::()? + + "foo".parse::()? + + "3".parse::()?) +}; +assert!(result.is_err()); +``` From 2d3438d35f8db4de0326f56232169b0bdbd6051c Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sat, 20 May 2017 12:08:28 -0400 Subject: [PATCH 3/3] Add basic Unstable Book entry for `attr_literals`. --- .../src/language-features/attr-literals.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/doc/unstable-book/src/language-features/attr-literals.md b/src/doc/unstable-book/src/language-features/attr-literals.md index 67eee214a4f..60741a74400 100644 --- a/src/doc/unstable-book/src/language-features/attr-literals.md +++ b/src/doc/unstable-book/src/language-features/attr-literals.md @@ -6,5 +6,25 @@ The tracking issue for this feature is: [#34981] ------------------------ +At present, literals are only accepted as the value of a key-value pair in +attributes. What's more, only _string_ literals are accepted. This means that +literals can only appear in forms of `#[attr(name = "value")]` or +`#[attr = "value"]`. +The `attr_literals` unstable feature allows other types of literals to be used +in attributes. Here are some examples of attributes that can now be used with +this feature enabled: + ++```rust,ignore ++#[attr] ++#[attr(true)] ++#[attr(ident)] ++#[attr(ident, 100, true, "true", ident = 100, ident = "hello", ident(100))] ++#[attr(100)] ++#[attr(enabled = true)] ++#[enabled(true)] ++#[attr("hello")] ++#[repr(C, align = 4)] ++#[repr(C, align(4))] ++```