From f8b66a001d74946565ee2e7df58afc9918455da1 Mon Sep 17 00:00:00 2001 From: Jason Orendorff Date: Fri, 19 May 2017 13:43:06 -0500 Subject: [PATCH 01/24] trace_macro: Show both the macro call and its expansion. #42072. --- src/libsyntax/ext/tt/macro_rules.rs | 15 ++++++++++++--- src/test/ui/macros/trace-macro.stderr | 7 +++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index a208f530602a5..d3da32304aa04 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -84,6 +84,12 @@ impl TTMacroExpander for MacroRulesMacroExpander { } } +fn trace_macros_note(cx: &mut ExtCtxt, sp: Span, message: String) { + let sp = sp.macro_backtrace().last().map(|trace| trace.call_site).unwrap_or(sp); + let mut values: &mut Vec = cx.expansions.entry(sp).or_insert_with(Vec::new); + values.push(message); +} + /// Given `lhses` and `rhses`, this is the new macro we create fn generic_extension<'cx>(cx: &'cx mut ExtCtxt, sp: Span, @@ -93,9 +99,7 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt, rhses: &[quoted::TokenTree]) -> Box { if cx.trace_macros() { - let sp = sp.macro_backtrace().last().map(|trace| trace.call_site).unwrap_or(sp); - let mut values: &mut Vec = cx.expansions.entry(sp).or_insert_with(Vec::new); - values.push(format!("expands to `{}! {{ {} }}`", name, arg)); + trace_macros_note(cx, sp, format!("expanding `{}! {{ {} }}`", name, arg)); } // Which arm's failure should we report? (the one furthest along) @@ -117,6 +121,11 @@ fn generic_extension<'cx>(cx: &'cx mut ExtCtxt, }; // rhs has holes ( `$id` and `$(...)` that need filled) let tts = transcribe(&cx.parse_sess.span_diagnostic, Some(named_matches), rhs); + + if cx.trace_macros() { + trace_macros_note(cx, sp, format!("to `{}`", tts)); + } + let directory = Directory { path: cx.current_expansion.module.directory.clone(), ownership: cx.current_expansion.directory_ownership, diff --git a/src/test/ui/macros/trace-macro.stderr b/src/test/ui/macros/trace-macro.stderr index 09117a4ca7404..6cf3b0bd35d5e 100644 --- a/src/test/ui/macros/trace-macro.stderr +++ b/src/test/ui/macros/trace-macro.stderr @@ -4,6 +4,9 @@ note: trace_macro 14 | println!("Hello, World!"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: expands to `println! { "Hello, World!" }` - = note: expands to `print! { concat ! ( "Hello, World!" , "/n" ) }` + = note: expanding `println! { "Hello, World!" }` + = note: to `print ! ( concat ! ( "Hello, World!" , "/n" ) )` + = note: expanding `print! { concat ! ( "Hello, World!" , "/n" ) }` + = note: to `$crate :: io :: _print ( format_args ! ( concat ! ( "Hello, World!" , "/n" ) ) + )` From 0b85b64d6b70b100f6222a96ff2337c302b386f1 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 22 May 2017 09:27:39 +0200 Subject: [PATCH 02/24] libstd/sync/mpsc: relicense under rust license These files are licensed under a different license than the rest of the codebase. This causes potential issues and inconveniences. Relicense these files under the standard license. I hold original copyright on that code. Fixes #36556 --- src/libstd/sync/mpsc/mpsc_queue.rs | 35 +++++++-------------------- src/libstd/sync/mpsc/spsc_queue.rs | 39 +++++++++--------------------- 2 files changed, 20 insertions(+), 54 deletions(-) diff --git a/src/libstd/sync/mpsc/mpsc_queue.rs b/src/libstd/sync/mpsc/mpsc_queue.rs index 8d80f942ff75c..296773d20f614 100644 --- a/src/libstd/sync/mpsc/mpsc_queue.rs +++ b/src/libstd/sync/mpsc/mpsc_queue.rs @@ -1,29 +1,12 @@ -/* Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are - * those of the authors and should not be interpreted as representing official - * policies, either expressed or implied, of Dmitry Vyukov. - */ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. //! A mostly lock-free multi-producer, single consumer queue. //! diff --git a/src/libstd/sync/mpsc/spsc_queue.rs b/src/libstd/sync/mpsc/spsc_queue.rs index 5858e4b6ddb1f..1148bc66fbabb 100644 --- a/src/libstd/sync/mpsc/spsc_queue.rs +++ b/src/libstd/sync/mpsc/spsc_queue.rs @@ -1,31 +1,12 @@ -/* Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are - * those of the authors and should not be interpreted as representing official - * policies, either expressed or implied, of Dmitry Vyukov. - */ - -// http://www.1024cores.net/home/lock-free-algorithms/queues/unbounded-spsc-queue +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. //! A single-producer single-consumer concurrent queue //! @@ -33,6 +14,8 @@ //! concurrently between two threads. This data structure is safe to use and //! enforces the semantics that there is one pusher and one popper. +// http://www.1024cores.net/home/lock-free-algorithms/queues/unbounded-spsc-queue + use alloc::boxed::Box; use core::ptr; use core::cell::UnsafeCell; From 6dde3f4c26c5a8bf9a6b66fcb96892fde0068548 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 16 May 2017 15:11:34 +0200 Subject: [PATCH 03/24] Move some tests from compile-fail to ui --- .../ui-fulldeps/auxiliary/attr_proc_macro.rs | 23 ++++++ .../ui-fulldeps/auxiliary/bang_proc_macro.rs | 23 ++++++ .../ui-fulldeps/auxiliary/derive-clona.rs | 23 ++++++ src/test/ui-fulldeps/auxiliary/derive-foo.rs | 23 ++++++ .../resolve-error.rs | 17 ----- src/test/ui-fulldeps/resolve-error.stderr | 76 +++++++++++++++++++ src/test/{compile-fail => ui}/issue-35675.rs | 0 src/test/ui/issue-35675.stderr | 74 ++++++++++++++++++ .../macros}/macro-name-typo.rs | 2 - src/test/ui/macros/macro-name-typo.stderr | 10 +++ .../macros}/macro_undefined.rs | 4 - src/test/ui/macros/macro_undefined.stderr | 18 +++++ src/test/ui/resolve-error.stderr | 76 +++++++++++++++++++ 13 files changed, 346 insertions(+), 23 deletions(-) create mode 100644 src/test/ui-fulldeps/auxiliary/attr_proc_macro.rs create mode 100644 src/test/ui-fulldeps/auxiliary/bang_proc_macro.rs create mode 100644 src/test/ui-fulldeps/auxiliary/derive-clona.rs create mode 100644 src/test/ui-fulldeps/auxiliary/derive-foo.rs rename src/test/{compile-fail-fulldeps/proc-macro => ui-fulldeps}/resolve-error.rs (57%) create mode 100644 src/test/ui-fulldeps/resolve-error.stderr rename src/test/{compile-fail => ui}/issue-35675.rs (100%) create mode 100644 src/test/ui/issue-35675.stderr rename src/test/{compile-fail => ui/macros}/macro-name-typo.rs (87%) create mode 100644 src/test/ui/macros/macro-name-typo.stderr rename src/test/{compile-fail => ui/macros}/macro_undefined.rs (74%) create mode 100644 src/test/ui/macros/macro_undefined.stderr create mode 100644 src/test/ui/resolve-error.stderr diff --git a/src/test/ui-fulldeps/auxiliary/attr_proc_macro.rs b/src/test/ui-fulldeps/auxiliary/attr_proc_macro.rs new file mode 100644 index 0000000000000..db0c19e96f821 --- /dev/null +++ b/src/test/ui-fulldeps/auxiliary/attr_proc_macro.rs @@ -0,0 +1,23 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// force-host +// no-prefer-dynamic +#![feature(proc_macro)] +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_attribute] +pub fn attr_proc_macro(_: TokenStream, input: TokenStream) -> TokenStream { + input +} diff --git a/src/test/ui-fulldeps/auxiliary/bang_proc_macro.rs b/src/test/ui-fulldeps/auxiliary/bang_proc_macro.rs new file mode 100644 index 0000000000000..89ac11b309d75 --- /dev/null +++ b/src/test/ui-fulldeps/auxiliary/bang_proc_macro.rs @@ -0,0 +1,23 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// force-host +// no-prefer-dynamic +#![feature(proc_macro)] +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro] +pub fn bang_proc_macro(input: TokenStream) -> TokenStream { + input +} diff --git a/src/test/ui-fulldeps/auxiliary/derive-clona.rs b/src/test/ui-fulldeps/auxiliary/derive-clona.rs new file mode 100644 index 0000000000000..719fbdb15ef2a --- /dev/null +++ b/src/test/ui-fulldeps/auxiliary/derive-clona.rs @@ -0,0 +1,23 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// force-host +// no-prefer-dynamic + +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_derive(Clona)] +pub fn derive_clonea(input: TokenStream) -> TokenStream { + "".parse().unwrap() +} diff --git a/src/test/ui-fulldeps/auxiliary/derive-foo.rs b/src/test/ui-fulldeps/auxiliary/derive-foo.rs new file mode 100644 index 0000000000000..64dcf72ba2029 --- /dev/null +++ b/src/test/ui-fulldeps/auxiliary/derive-foo.rs @@ -0,0 +1,23 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// force-host +// no-prefer-dynamic + +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_derive(FooWithLongName)] +pub fn derive_foo(input: TokenStream) -> TokenStream { + "".parse().unwrap() +} diff --git a/src/test/compile-fail-fulldeps/proc-macro/resolve-error.rs b/src/test/ui-fulldeps/resolve-error.rs similarity index 57% rename from src/test/compile-fail-fulldeps/proc-macro/resolve-error.rs rename to src/test/ui-fulldeps/resolve-error.rs index ddd8631f02e62..dfaa1d7a32e57 100644 --- a/src/test/compile-fail-fulldeps/proc-macro/resolve-error.rs +++ b/src/test/ui-fulldeps/resolve-error.rs @@ -35,46 +35,29 @@ macro_rules! attr_proc_mac { } #[derive(FooWithLongNan)] -//~^ ERROR cannot find derive macro `FooWithLongNan` in this scope -//~^^ HELP did you mean `FooWithLongName`? struct Foo; #[attr_proc_macra] -//~^ ERROR cannot find attribute macro `attr_proc_macra` in this scope -//~^^ HELP did you mean `attr_proc_macro`? struct Bar; #[FooWithLongNan] -//~^ ERROR cannot find attribute macro `FooWithLongNan` in this scope struct Asdf; #[derive(Dlone)] -//~^ ERROR cannot find derive macro `Dlone` in this scope -//~^^ HELP did you mean `Clone`? struct A; #[derive(Dlona)] -//~^ ERROR cannot find derive macro `Dlona` in this scope -//~^^ HELP did you mean `Clona`? struct B; #[derive(attr_proc_macra)] -//~^ ERROR cannot find derive macro `attr_proc_macra` in this scope struct C; fn main() { FooWithLongNama!(); - //~^ ERROR cannot find macro `FooWithLongNama!` in this scope - //~^^ HELP did you mean `FooWithLongNam!`? attr_proc_macra!(); - //~^ ERROR cannot find macro `attr_proc_macra!` in this scope - //~^^ HELP did you mean `attr_proc_mac!`? Dlona!(); - //~^ ERROR cannot find macro `Dlona!` in this scope bang_proc_macrp!(); - //~^ ERROR cannot find macro `bang_proc_macrp!` in this scope - //~^^ HELP did you mean `bang_proc_macro!`? } diff --git a/src/test/ui-fulldeps/resolve-error.stderr b/src/test/ui-fulldeps/resolve-error.stderr new file mode 100644 index 0000000000000..cfc15d69feb63 --- /dev/null +++ b/src/test/ui-fulldeps/resolve-error.stderr @@ -0,0 +1,76 @@ +error: cannot find derive macro `FooWithLongNan` in this scope + --> $DIR/resolve-error.rs:36:10 + | +36 | #[derive(FooWithLongNan)] + | ^^^^^^^^^^^^^^ + | + = help: did you mean `FooWithLongName`? + +error: cannot find attribute macro `attr_proc_macra` in this scope + --> $DIR/resolve-error.rs:39:3 + | +39 | #[attr_proc_macra] + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `attr_proc_macro`? + +error: cannot find attribute macro `FooWithLongNan` in this scope + --> $DIR/resolve-error.rs:42:3 + | +42 | #[FooWithLongNan] + | ^^^^^^^^^^^^^^ + +error: cannot find derive macro `Dlone` in this scope + --> $DIR/resolve-error.rs:45:10 + | +45 | #[derive(Dlone)] + | ^^^^^ + | + = help: did you mean `Clone`? + +error: cannot find derive macro `Dlona` in this scope + --> $DIR/resolve-error.rs:48:10 + | +48 | #[derive(Dlona)] + | ^^^^^ + | + = help: did you mean `Clona`? + +error: cannot find derive macro `attr_proc_macra` in this scope + --> $DIR/resolve-error.rs:51:10 + | +51 | #[derive(attr_proc_macra)] + | ^^^^^^^^^^^^^^^ + +error: cannot find macro `FooWithLongNama!` in this scope + --> $DIR/resolve-error.rs:55:5 + | +55 | FooWithLongNama!(); + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `FooWithLongNam!`? + +error: cannot find macro `attr_proc_macra!` in this scope + --> $DIR/resolve-error.rs:57:5 + | +57 | attr_proc_macra!(); + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `attr_proc_mac!`? + +error: cannot find macro `Dlona!` in this scope + --> $DIR/resolve-error.rs:59:5 + | +59 | Dlona!(); + | ^^^^^ + +error: cannot find macro `bang_proc_macrp!` in this scope + --> $DIR/resolve-error.rs:61:5 + | +61 | bang_proc_macrp!(); + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `bang_proc_macro!`? + +error: aborting due to 10 previous errors + diff --git a/src/test/compile-fail/issue-35675.rs b/src/test/ui/issue-35675.rs similarity index 100% rename from src/test/compile-fail/issue-35675.rs rename to src/test/ui/issue-35675.rs diff --git a/src/test/ui/issue-35675.stderr b/src/test/ui/issue-35675.stderr new file mode 100644 index 0000000000000..78b98bfb574ef --- /dev/null +++ b/src/test/ui/issue-35675.stderr @@ -0,0 +1,74 @@ +error[E0412]: cannot find type `Apple` in this scope + --> $DIR/issue-35675.rs:20:29 + | +20 | fn should_return_fruit() -> Apple { + | ^^^^^ not found in this scope + | +help: there is an enum variant `Fruit::Apple`, did you mean to use `Fruit`? + --> $DIR/issue-35675.rs:14:5 + | +14 | Apple(i64), + | ^^^^^^^^^^ + +error[E0425]: cannot find function `Apple` in this scope + --> $DIR/issue-35675.rs:23:5 + | +23 | Apple(5) + | ^^^^^ not found in this scope + | +help: possible candidate is found in another module, you can import it into scope + | use Fruit::Apple; + +error[E0573]: expected type, found variant `Fruit::Apple` + --> $DIR/issue-35675.rs:28:33 + | +28 | fn should_return_fruit_too() -> Fruit::Apple { + | ^^^^^^^^^^^^ not a type + | +help: there is an enum variant `Fruit::Apple`, did you mean to use `Fruit`? + --> $DIR/issue-35675.rs:14:5 + | +14 | Apple(i64), + | ^^^^^^^^^^ + +error[E0425]: cannot find function `Apple` in this scope + --> $DIR/issue-35675.rs:31:5 + | +31 | Apple(5) + | ^^^^^ not found in this scope + | +help: possible candidate is found in another module, you can import it into scope + | use Fruit::Apple; + +error[E0573]: expected type, found variant `Ok` + --> $DIR/issue-35675.rs:36:13 + | +36 | fn foo() -> Ok { + | ^^ not a type + | + = help: there is an enum variant `std::prelude::v1::Ok`, did you mean to use `std::prelude::v1`? + = help: there is an enum variant `std::prelude::v1::Result::Ok`, did you mean to use `std::prelude::v1::Result`? + +error[E0412]: cannot find type `Variant3` in this scope + --> $DIR/issue-35675.rs:44:13 + | +44 | fn bar() -> Variant3 { + | ^^^^^^^^ not found in this scope + | +help: there is an enum variant `x::Enum::Variant3`, did you mean to use `x::Enum`? + --> $DIR/issue-35675.rs:63:9 + | +63 | Variant3(usize), + | ^^^^^^^^^^^^^^^ + +error[E0573]: expected type, found variant `Some` + --> $DIR/issue-35675.rs:49:13 + | +49 | fn qux() -> Some { + | ^^^^ not a type + | + = help: there is an enum variant `std::option::Option::Some`, did you mean to use `std::option::Option`? + = help: there is an enum variant `std::prelude::v1::Some`, did you mean to use `std::prelude::v1`? + +error: aborting due to 7 previous errors + diff --git a/src/test/compile-fail/macro-name-typo.rs b/src/test/ui/macros/macro-name-typo.rs similarity index 87% rename from src/test/compile-fail/macro-name-typo.rs rename to src/test/ui/macros/macro-name-typo.rs index 4840205fee4c3..ec8d27f9138f7 100644 --- a/src/test/compile-fail/macro-name-typo.rs +++ b/src/test/ui/macros/macro-name-typo.rs @@ -10,6 +10,4 @@ fn main() { printlx!("oh noes!"); - //~^ ERROR cannot find macro - //~^^ HELP did you mean `println!`? } diff --git a/src/test/ui/macros/macro-name-typo.stderr b/src/test/ui/macros/macro-name-typo.stderr new file mode 100644 index 0000000000000..940ad55481ed4 --- /dev/null +++ b/src/test/ui/macros/macro-name-typo.stderr @@ -0,0 +1,10 @@ +error: cannot find macro `printlx!` in this scope + --> $DIR/macro-name-typo.rs:12:5 + | +12 | printlx!("oh noes!"); + | ^^^^^^^ + | + = help: did you mean `println!`? + +error: aborting due to previous error + diff --git a/src/test/compile-fail/macro_undefined.rs b/src/test/ui/macros/macro_undefined.rs similarity index 74% rename from src/test/compile-fail/macro_undefined.rs rename to src/test/ui/macros/macro_undefined.rs index 00c8d44f30602..db93ba5e2c41d 100644 --- a/src/test/compile-fail/macro_undefined.rs +++ b/src/test/ui/macros/macro_undefined.rs @@ -19,9 +19,5 @@ mod m { fn main() { k!(); - //~^ ERROR cannot find macro `k!` in this scope - //~^^ HELP did you mean `kl!`? kl!(); - //~^ ERROR cannot find macro `kl!` in this scope - //~^^ HELP have you added the `#[macro_use]` on the module/import? } diff --git a/src/test/ui/macros/macro_undefined.stderr b/src/test/ui/macros/macro_undefined.stderr new file mode 100644 index 0000000000000..f1c2151a65c17 --- /dev/null +++ b/src/test/ui/macros/macro_undefined.stderr @@ -0,0 +1,18 @@ +error: cannot find macro `kl!` in this scope + --> $DIR/macro_undefined.rs:22:5 + | +22 | kl!(); + | ^^ + | + = help: have you added the `#[macro_use]` on the module/import? + +error: cannot find macro `k!` in this scope + --> $DIR/macro_undefined.rs:21:5 + | +21 | k!(); + | ^ + | + = help: did you mean `kl!`? + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/resolve-error.stderr b/src/test/ui/resolve-error.stderr new file mode 100644 index 0000000000000..cfc15d69feb63 --- /dev/null +++ b/src/test/ui/resolve-error.stderr @@ -0,0 +1,76 @@ +error: cannot find derive macro `FooWithLongNan` in this scope + --> $DIR/resolve-error.rs:36:10 + | +36 | #[derive(FooWithLongNan)] + | ^^^^^^^^^^^^^^ + | + = help: did you mean `FooWithLongName`? + +error: cannot find attribute macro `attr_proc_macra` in this scope + --> $DIR/resolve-error.rs:39:3 + | +39 | #[attr_proc_macra] + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `attr_proc_macro`? + +error: cannot find attribute macro `FooWithLongNan` in this scope + --> $DIR/resolve-error.rs:42:3 + | +42 | #[FooWithLongNan] + | ^^^^^^^^^^^^^^ + +error: cannot find derive macro `Dlone` in this scope + --> $DIR/resolve-error.rs:45:10 + | +45 | #[derive(Dlone)] + | ^^^^^ + | + = help: did you mean `Clone`? + +error: cannot find derive macro `Dlona` in this scope + --> $DIR/resolve-error.rs:48:10 + | +48 | #[derive(Dlona)] + | ^^^^^ + | + = help: did you mean `Clona`? + +error: cannot find derive macro `attr_proc_macra` in this scope + --> $DIR/resolve-error.rs:51:10 + | +51 | #[derive(attr_proc_macra)] + | ^^^^^^^^^^^^^^^ + +error: cannot find macro `FooWithLongNama!` in this scope + --> $DIR/resolve-error.rs:55:5 + | +55 | FooWithLongNama!(); + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `FooWithLongNam!`? + +error: cannot find macro `attr_proc_macra!` in this scope + --> $DIR/resolve-error.rs:57:5 + | +57 | attr_proc_macra!(); + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `attr_proc_mac!`? + +error: cannot find macro `Dlona!` in this scope + --> $DIR/resolve-error.rs:59:5 + | +59 | Dlona!(); + | ^^^^^ + +error: cannot find macro `bang_proc_macrp!` in this scope + --> $DIR/resolve-error.rs:61:5 + | +61 | bang_proc_macrp!(); + | ^^^^^^^^^^^^^^^ + | + = help: did you mean `bang_proc_macro!`? + +error: aborting due to 10 previous errors + From ec1fa6de0dde87e350170c55d7017018cc45fd6e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 16 May 2017 15:12:24 +0200 Subject: [PATCH 04/24] Change macro typo helps to suggestions --- src/librustc_resolve/macros.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 231d30cd2a22d..30f0190c1c1b7 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -649,9 +649,9 @@ impl<'a> Resolver<'a> { if let Some(suggestion) = suggestion { if suggestion != name { if let MacroKind::Bang = kind { - err.help(&format!("did you mean `{}!`?", suggestion)); + err.span_suggestion(span, "did you mean", format!("{}!", suggestion)); } else { - err.help(&format!("did you mean `{}`?", suggestion)); + err.span_suggestion(span, "did you mean", suggestion.to_string()); } } else { err.help("have you added the `#[macro_use]` on the module/import?"); From 27359bdebbb376ab690d23db6cbda2544d12c5ea Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 16 May 2017 15:13:25 +0200 Subject: [PATCH 05/24] Change enum variant help into a suggestion --- src/librustc_resolve/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 6ea666e21dcdd..0d66f0012a9cb 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2307,13 +2307,14 @@ impl<'a> Resolver<'a> { .map(|suggestion| import_candidate_to_paths(&suggestion)).collect::>(); enum_candidates.sort(); for (sp, variant_path, enum_path) in enum_candidates { - let msg = format!("there is an enum variant `{}`, did you mean to use `{}`?", - variant_path, - enum_path); if sp == DUMMY_SP { + let msg = format!("there is an enum variant `{}`,\ + did you mean to use `{}`?", + variant_path, + enum_path); err.help(&msg); } else { - err.span_help(sp, &msg); + err.span_suggestion(span, "did you mean the variant's enum", enum_path); } } } From e328ef06e1756f680c513875c424e925e81885b4 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 16 May 2017 15:14:10 +0200 Subject: [PATCH 06/24] Change some "did you mean `self.*`" messages to suggestions --- src/librustc_resolve/lib.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 0d66f0012a9cb..903fa88f37efa 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2323,18 +2323,20 @@ impl<'a> Resolver<'a> { let self_is_available = this.self_value_is_available(path[0].ctxt, span); match candidate { AssocSuggestion::Field => { - err.span_label(span, format!("did you mean `self.{}`?", path_str)); + err.span_suggestion(span, "did you mean", + format!("self.{}", path_str)); if !self_is_available { err.span_label(span, format!("`self` value is only available in \ methods with `self` parameter")); } } AssocSuggestion::MethodWithSelf if self_is_available => { - err.span_label(span, format!("did you mean `self.{}(...)`?", - path_str)); + err.span_suggestion(span, "did you mean", + format!("self.{}", path_str)); } AssocSuggestion::MethodWithSelf | AssocSuggestion::AssocItem => { - err.span_label(span, format!("did you mean `Self::{}`?", path_str)); + err.span_suggestion(span, "did you mean", + format!("Self::{}", path_str)); } } return err; From 8add02aa88e7302107808e8c14bb0ef805f5d357 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 16 May 2017 16:16:26 +0200 Subject: [PATCH 07/24] Changes in ui tests --- src/test/ui/issue-35675.stderr | 41 ++++++++----------- src/test/ui/resolve-error.stderr | 28 ++++--------- src/test/ui/resolve/issue-14254.stderr | 38 ++++++++--------- src/test/ui/resolve/issue-2356.stderr | 12 +++--- .../resolve/resolve-assoc-suggestions.stderr | 6 +-- .../resolve-speculative-adjustment.stderr | 4 +- .../unresolved_static_type_field.stderr | 2 +- 7 files changed, 54 insertions(+), 77 deletions(-) diff --git a/src/test/ui/issue-35675.stderr b/src/test/ui/issue-35675.stderr index 78b98bfb574ef..13eeefc14aa0a 100644 --- a/src/test/ui/issue-35675.stderr +++ b/src/test/ui/issue-35675.stderr @@ -2,13 +2,10 @@ error[E0412]: cannot find type `Apple` in this scope --> $DIR/issue-35675.rs:20:29 | 20 | fn should_return_fruit() -> Apple { - | ^^^^^ not found in this scope - | -help: there is an enum variant `Fruit::Apple`, did you mean to use `Fruit`? - --> $DIR/issue-35675.rs:14:5 - | -14 | Apple(i64), - | ^^^^^^^^^^ + | ^^^^^ + | | + | not found in this scope + | help: did you mean the variant's enum `Fruit` error[E0425]: cannot find function `Apple` in this scope --> $DIR/issue-35675.rs:23:5 @@ -23,13 +20,10 @@ error[E0573]: expected type, found variant `Fruit::Apple` --> $DIR/issue-35675.rs:28:33 | 28 | fn should_return_fruit_too() -> Fruit::Apple { - | ^^^^^^^^^^^^ not a type - | -help: there is an enum variant `Fruit::Apple`, did you mean to use `Fruit`? - --> $DIR/issue-35675.rs:14:5 - | -14 | Apple(i64), - | ^^^^^^^^^^ + | ^^^^^^^^^^^^ + | | + | not a type + | help: did you mean the variant's enum `Fruit` error[E0425]: cannot find function `Apple` in this scope --> $DIR/issue-35675.rs:31:5 @@ -46,20 +40,17 @@ error[E0573]: expected type, found variant `Ok` 36 | fn foo() -> Ok { | ^^ not a type | - = help: there is an enum variant `std::prelude::v1::Ok`, did you mean to use `std::prelude::v1`? - = help: there is an enum variant `std::prelude::v1::Result::Ok`, did you mean to use `std::prelude::v1::Result`? + = help: there is an enum variant `std::prelude::v1::Ok`,did you mean to use `std::prelude::v1`? + = help: there is an enum variant `std::prelude::v1::Result::Ok`,did you mean to use `std::prelude::v1::Result`? error[E0412]: cannot find type `Variant3` in this scope --> $DIR/issue-35675.rs:44:13 | 44 | fn bar() -> Variant3 { - | ^^^^^^^^ not found in this scope - | -help: there is an enum variant `x::Enum::Variant3`, did you mean to use `x::Enum`? - --> $DIR/issue-35675.rs:63:9 - | -63 | Variant3(usize), - | ^^^^^^^^^^^^^^^ + | ^^^^^^^^ + | | + | not found in this scope + | help: did you mean the variant's enum `x::Enum` error[E0573]: expected type, found variant `Some` --> $DIR/issue-35675.rs:49:13 @@ -67,8 +58,8 @@ error[E0573]: expected type, found variant `Some` 49 | fn qux() -> Some { | ^^^^ not a type | - = help: there is an enum variant `std::option::Option::Some`, did you mean to use `std::option::Option`? - = help: there is an enum variant `std::prelude::v1::Some`, did you mean to use `std::prelude::v1`? + = help: there is an enum variant `std::option::Option::Some`,did you mean to use `std::option::Option`? + = help: there is an enum variant `std::prelude::v1::Some`,did you mean to use `std::prelude::v1`? error: aborting due to 7 previous errors diff --git a/src/test/ui/resolve-error.stderr b/src/test/ui/resolve-error.stderr index cfc15d69feb63..788e53ad85e55 100644 --- a/src/test/ui/resolve-error.stderr +++ b/src/test/ui/resolve-error.stderr @@ -2,17 +2,13 @@ error: cannot find derive macro `FooWithLongNan` in this scope --> $DIR/resolve-error.rs:36:10 | 36 | #[derive(FooWithLongNan)] - | ^^^^^^^^^^^^^^ - | - = help: did you mean `FooWithLongName`? + | ^^^^^^^^^^^^^^ help: did you mean `FooWithLongName` error: cannot find attribute macro `attr_proc_macra` in this scope --> $DIR/resolve-error.rs:39:3 | 39 | #[attr_proc_macra] - | ^^^^^^^^^^^^^^^ - | - = help: did you mean `attr_proc_macro`? + | ^^^^^^^^^^^^^^^ help: did you mean `attr_proc_macro` error: cannot find attribute macro `FooWithLongNan` in this scope --> $DIR/resolve-error.rs:42:3 @@ -24,17 +20,13 @@ error: cannot find derive macro `Dlone` in this scope --> $DIR/resolve-error.rs:45:10 | 45 | #[derive(Dlone)] - | ^^^^^ - | - = help: did you mean `Clone`? + | ^^^^^ help: did you mean `Clone` error: cannot find derive macro `Dlona` in this scope --> $DIR/resolve-error.rs:48:10 | 48 | #[derive(Dlona)] - | ^^^^^ - | - = help: did you mean `Clona`? + | ^^^^^ help: did you mean `Clona` error: cannot find derive macro `attr_proc_macra` in this scope --> $DIR/resolve-error.rs:51:10 @@ -46,17 +38,13 @@ error: cannot find macro `FooWithLongNama!` in this scope --> $DIR/resolve-error.rs:55:5 | 55 | FooWithLongNama!(); - | ^^^^^^^^^^^^^^^ - | - = help: did you mean `FooWithLongNam!`? + | ^^^^^^^^^^^^^^^ help: did you mean `FooWithLongNam!` error: cannot find macro `attr_proc_macra!` in this scope --> $DIR/resolve-error.rs:57:5 | 57 | attr_proc_macra!(); - | ^^^^^^^^^^^^^^^ - | - = help: did you mean `attr_proc_mac!`? + | ^^^^^^^^^^^^^^^ help: did you mean `attr_proc_mac!` error: cannot find macro `Dlona!` in this scope --> $DIR/resolve-error.rs:59:5 @@ -68,9 +56,7 @@ error: cannot find macro `bang_proc_macrp!` in this scope --> $DIR/resolve-error.rs:61:5 | 61 | bang_proc_macrp!(); - | ^^^^^^^^^^^^^^^ - | - = help: did you mean `bang_proc_macro!`? + | ^^^^^^^^^^^^^^^ help: did you mean `bang_proc_macro!` error: aborting due to 10 previous errors diff --git a/src/test/ui/resolve/issue-14254.stderr b/src/test/ui/resolve/issue-14254.stderr index 18eb2fabdacb5..3d9668b62d533 100644 --- a/src/test/ui/resolve/issue-14254.stderr +++ b/src/test/ui/resolve/issue-14254.stderr @@ -2,7 +2,7 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:29:9 | 29 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `a` in this scope --> $DIR/issue-14254.rs:32:9 @@ -14,19 +14,19 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:40:9 | 40 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `x` in this scope --> $DIR/issue-14254.rs:43:9 | 43 | x; - | ^ did you mean `self.x`? + | ^ help: did you mean `self.x` error[E0425]: cannot find value `y` in this scope --> $DIR/issue-14254.rs:46:9 | 46 | y; - | ^ did you mean `self.y`? + | ^ help: did you mean `self.y` error[E0425]: cannot find value `a` in this scope --> $DIR/issue-14254.rs:49:9 @@ -38,7 +38,7 @@ error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:52:9 | 52 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error[E0425]: cannot find value `b` in this scope --> $DIR/issue-14254.rs:55:9 @@ -50,19 +50,19 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:63:9 | 63 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `x` in this scope --> $DIR/issue-14254.rs:66:9 | 66 | x; - | ^ did you mean `self.x`? + | ^ help: did you mean `self.x` error[E0425]: cannot find value `y` in this scope --> $DIR/issue-14254.rs:69:9 | 69 | y; - | ^ did you mean `self.y`? + | ^ help: did you mean `self.y` error[E0425]: cannot find value `a` in this scope --> $DIR/issue-14254.rs:72:9 @@ -74,7 +74,7 @@ error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:75:9 | 75 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error[E0425]: cannot find value `b` in this scope --> $DIR/issue-14254.rs:78:9 @@ -86,61 +86,61 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:86:9 | 86 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:89:9 | 89 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:97:9 | 97 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:100:9 | 100 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:108:9 | 108 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:111:9 | 111 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:119:9 | 119 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:122:9 | 122 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:130:9 | 130 | baz(); - | ^^^ did you mean `self.baz(...)`? + | ^^^ help: did you mean `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:133:9 | 133 | bah; - | ^^^ did you mean `Self::bah`? + | ^^^ help: did you mean `Self::bah` error: main function not found diff --git a/src/test/ui/resolve/issue-2356.stderr b/src/test/ui/resolve/issue-2356.stderr index 039887d8da65f..609c880a592e3 100644 --- a/src/test/ui/resolve/issue-2356.stderr +++ b/src/test/ui/resolve/issue-2356.stderr @@ -8,13 +8,13 @@ error[E0425]: cannot find function `clone` in this scope --> $DIR/issue-2356.rs:35:5 | 35 | clone(); - | ^^^^^ did you mean `self.clone(...)`? + | ^^^^^ help: did you mean `self.clone` error[E0425]: cannot find function `default` in this scope --> $DIR/issue-2356.rs:43:5 | 43 | default(); - | ^^^^^^^ did you mean `Self::default`? + | ^^^^^^^ help: did you mean `Self::default` error[E0425]: cannot find value `whiskers` in this scope --> $DIR/issue-2356.rs:52:5 @@ -22,14 +22,14 @@ error[E0425]: cannot find value `whiskers` in this scope 52 | whiskers -= other; | ^^^^^^^^ | | - | did you mean `self.whiskers`? + | help: did you mean `self.whiskers` | `self` value is only available in methods with `self` parameter error[E0425]: cannot find function `shave` in this scope --> $DIR/issue-2356.rs:57:5 | 57 | shave(4); - | ^^^^^ did you mean `Self::shave`? + | ^^^^^ help: did you mean `Self::shave` error[E0425]: cannot find function `purr` in this scope --> $DIR/issue-2356.rs:60:5 @@ -83,7 +83,7 @@ error[E0425]: cannot find value `whiskers` in this scope --> $DIR/issue-2356.rs:104:5 | 104 | whiskers = 0; - | ^^^^^^^^ did you mean `self.whiskers`? + | ^^^^^^^^ help: did you mean `self.whiskers` error[E0425]: cannot find value `whiskers` in this scope --> $DIR/issue-2356.rs:110:5 @@ -91,7 +91,7 @@ error[E0425]: cannot find value `whiskers` in this scope 110 | whiskers = 4; | ^^^^^^^^ | | - | did you mean `self.whiskers`? + | help: did you mean `self.whiskers` | `self` value is only available in methods with `self` parameter error[E0425]: cannot find function `purr_louder` in this scope diff --git a/src/test/ui/resolve/resolve-assoc-suggestions.stderr b/src/test/ui/resolve/resolve-assoc-suggestions.stderr index 7975c168de7d4..9ee715718e402 100644 --- a/src/test/ui/resolve/resolve-assoc-suggestions.stderr +++ b/src/test/ui/resolve/resolve-assoc-suggestions.stderr @@ -14,13 +14,13 @@ error[E0425]: cannot find value `field` in this scope --> $DIR/resolve-assoc-suggestions.rs:32:9 | 32 | field; - | ^^^^^ did you mean `self.field`? + | ^^^^^ help: did you mean `self.field` error[E0412]: cannot find type `Type` in this scope --> $DIR/resolve-assoc-suggestions.rs:36:16 | 36 | let _: Type; - | ^^^^ did you mean `Self::Type`? + | ^^^^ help: did you mean `Self::Type` error[E0531]: cannot find tuple struct/variant `Type` in this scope --> $DIR/resolve-assoc-suggestions.rs:39:13 @@ -50,7 +50,7 @@ error[E0425]: cannot find value `method` in this scope --> $DIR/resolve-assoc-suggestions.rs:52:9 | 52 | method; - | ^^^^^^ did you mean `self.method(...)`? + | ^^^^^^ help: did you mean `self.method` error: aborting due to 9 previous errors diff --git a/src/test/ui/resolve/resolve-speculative-adjustment.stderr b/src/test/ui/resolve/resolve-speculative-adjustment.stderr index e7df8140bc577..05601a825c85e 100644 --- a/src/test/ui/resolve/resolve-speculative-adjustment.stderr +++ b/src/test/ui/resolve/resolve-speculative-adjustment.stderr @@ -14,13 +14,13 @@ error[E0425]: cannot find value `field` in this scope --> $DIR/resolve-speculative-adjustment.rs:35:9 | 35 | field; - | ^^^^^ did you mean `self.field`? + | ^^^^^ help: did you mean `self.field` error[E0425]: cannot find function `method` in this scope --> $DIR/resolve-speculative-adjustment.rs:38:9 | 38 | method(); - | ^^^^^^ did you mean `self.method(...)`? + | ^^^^^^ help: did you mean `self.method` error: aborting due to 4 previous errors diff --git a/src/test/ui/resolve/unresolved_static_type_field.stderr b/src/test/ui/resolve/unresolved_static_type_field.stderr index 5fbaf66e014af..94b9bca776161 100644 --- a/src/test/ui/resolve/unresolved_static_type_field.stderr +++ b/src/test/ui/resolve/unresolved_static_type_field.stderr @@ -4,7 +4,7 @@ error[E0425]: cannot find value `cx` in this scope 19 | f(cx); | ^^ | | - | did you mean `self.cx`? + | help: did you mean `self.cx` | `self` value is only available in methods with `self` parameter error: aborting due to previous error From e618a4f82ba0fc43bb23b8c4765c84cd48a1a218 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 18 May 2017 16:46:58 +0200 Subject: [PATCH 08/24] Add some guidelines for suggestion messages and follow them --- src/librustc_borrowck/borrowck/mod.rs | 2 +- src/librustc_errors/diagnostic.rs | 12 ++++++++++++ src/librustc_errors/emitter.rs | 2 +- src/librustc_resolve/lib.rs | 12 ++++++------ src/librustc_resolve/macros.rs | 4 ++-- src/librustc_typeck/check/cast.rs | 4 ++-- src/librustc_typeck/check/op.rs | 2 +- src/libsyntax/parse/parser.rs | 4 ++-- 8 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index c28d45be18d9e..ecf20398a25a2 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -1002,7 +1002,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { .span_suggestion(err.span, &format!("to force the closure to take ownership of {} \ (and any other referenced variables), \ - use the `move` keyword, as shown:", + use the `move` keyword", cmt_path_or_string), suggestion) .emit(); diff --git a/src/librustc_errors/diagnostic.rs b/src/librustc_errors/diagnostic.rs index 861880aa265ec..07c6fa236661d 100644 --- a/src/librustc_errors/diagnostic.rs +++ b/src/librustc_errors/diagnostic.rs @@ -203,6 +203,18 @@ impl Diagnostic { /// Prints out a message with a suggested edit of the code. /// + /// In case of short messages and a simple suggestion, + /// rustc displays it as a label like + /// + /// "try adding parentheses: `(tup.0).1`" + /// + /// The message + /// * should not end in any punctuation (a `:` is added automatically) + /// * should not be a question + /// * should not contain any parts like "the following", "as shown" + /// * may look like "to do xyz, use" or "to do xyz, use abc" + /// * may contain a name of a function, variable or type, but not whole expressions + /// /// See `diagnostic::CodeSuggestion` for more information. pub fn span_suggestion(&mut self, sp: Span, msg: &str, suggestion: String) -> &mut Self { self.suggestions.push(CodeSuggestion { diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs index a9645f9ab7bb2..24e5040f2a234 100644 --- a/src/librustc_errors/emitter.rs +++ b/src/librustc_errors/emitter.rs @@ -46,7 +46,7 @@ impl Emitter for EmitterWriter { // don't display multiline suggestions as labels sugg.substitution_parts[0].substitutions[0].find('\n').is_none() { let substitution = &sugg.substitution_parts[0].substitutions[0]; - let msg = format!("help: {} `{}`", sugg.msg, substitution); + let msg = format!("help: {}: `{}`", sugg.msg, substitution); primary_span.push_span_label(sugg.substitution_spans().next().unwrap(), msg); } else { // if there are multiple suggestions, print them all in full diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 903fa88f37efa..650fc8c7e8065 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2308,13 +2308,13 @@ impl<'a> Resolver<'a> { enum_candidates.sort(); for (sp, variant_path, enum_path) in enum_candidates { if sp == DUMMY_SP { - let msg = format!("there is an enum variant `{}`,\ - did you mean to use `{}`?", + let msg = format!("there is an enum variant `{}`, \ + try using `{}`?", variant_path, enum_path); err.help(&msg); } else { - err.span_suggestion(span, "did you mean the variant's enum", enum_path); + err.span_suggestion(span, "you can try using the variant's enum", enum_path); } } } @@ -2323,7 +2323,7 @@ impl<'a> Resolver<'a> { let self_is_available = this.self_value_is_available(path[0].ctxt, span); match candidate { AssocSuggestion::Field => { - err.span_suggestion(span, "did you mean", + err.span_suggestion(span, "try", format!("self.{}", path_str)); if !self_is_available { err.span_label(span, format!("`self` value is only available in \ @@ -2331,11 +2331,11 @@ impl<'a> Resolver<'a> { } } AssocSuggestion::MethodWithSelf if self_is_available => { - err.span_suggestion(span, "did you mean", + err.span_suggestion(span, "try", format!("self.{}", path_str)); } AssocSuggestion::MethodWithSelf | AssocSuggestion::AssocItem => { - err.span_suggestion(span, "did you mean", + err.span_suggestion(span, "try", format!("Self::{}", path_str)); } } diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 30f0190c1c1b7..9951fa20920c9 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -649,9 +649,9 @@ impl<'a> Resolver<'a> { if let Some(suggestion) = suggestion { if suggestion != name { if let MacroKind::Bang = kind { - err.span_suggestion(span, "did you mean", format!("{}!", suggestion)); + err.span_suggestion(span, "you could try the macro", format!("{}!", suggestion)); } else { - err.span_suggestion(span, "did you mean", suggestion.to_string()); + err.span_suggestion(span, "try", suggestion.to_string()); } } else { err.help("have you added the `#[macro_use]` on the module/import?"); diff --git a/src/librustc_typeck/check/cast.rs b/src/librustc_typeck/check/cast.rs index 72ce7d3b5ed71..408837d0e82e3 100644 --- a/src/librustc_typeck/check/cast.rs +++ b/src/librustc_typeck/check/cast.rs @@ -276,7 +276,7 @@ impl<'a, 'gcx, 'tcx> CastCheck<'tcx> { match fcx.tcx.sess.codemap().span_to_snippet(self.cast_span) { Ok(s) => { err.span_suggestion(self.cast_span, - "try casting to a reference instead:", + "try casting to a reference instead", format!("&{}{}", mtstr, s)); } Err(_) => { @@ -295,7 +295,7 @@ impl<'a, 'gcx, 'tcx> CastCheck<'tcx> { match fcx.tcx.sess.codemap().span_to_snippet(self.cast_span) { Ok(s) => { err.span_suggestion(self.cast_span, - "try casting to a `Box` instead:", + "try casting to a `Box` instead", format!("Box<{}>", s)); } Err(_) => span_help!(err, self.cast_span, "did you mean `Box<{}>`?", tstr), diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index 59cb61d9b97f0..2c33bcb3a050a 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -290,7 +290,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { from a string reference. String concatenation \ appends the string on the right to the string \ on the left and may require reallocation. This \ - requires ownership of the string on the left."), suggestion); + requires ownership of the string on the left"), suggestion); is_string_addition = true; } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 4741f896d3cc0..963942a016f73 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1507,7 +1507,7 @@ impl<'a> Parser<'a> { s.print_bounds(" +", &bounds)?; s.pclose() }); - err.span_suggestion(sum_span, "try adding parentheses:", sum_with_parens); + err.span_suggestion(sum_span, "try adding parentheses", sum_with_parens); } TyKind::Ptr(..) | TyKind::BareFn(..) => { err.span_label(sum_span, "perhaps you forgot parentheses?"); @@ -5180,7 +5180,7 @@ impl<'a> Parser<'a> { `pub(in path::to::module)`: visible only on the specified path"##; let path = self.parse_path(PathStyle::Mod)?; let path_span = self.prev_span; - let help_msg = format!("make this visible only to module `{}` with `in`:", path); + let help_msg = format!("make this visible only to module `{}` with `in`", path); self.expect(&token::CloseDelim(token::Paren))?; // `)` let mut err = self.span_fatal_help(path_span, msg, suggestion); err.span_suggestion(path_span, &help_msg, format!("in {}", path)); From a9b54ab742a8f059ade19ea06debce59ba4ed274 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 18 May 2017 17:24:49 +0200 Subject: [PATCH 09/24] Update ui tests output --- src/test/ui-fulldeps/resolve-error.stderr | 68 ++++++++----------- src/test/ui/issue-35675.stderr | 14 ++-- .../issue-40402-1.stderr | 2 +- src/test/ui/macros/macro-name-typo.stderr | 4 +- src/test/ui/macros/macro_undefined.stderr | 4 +- src/test/ui/resolve/issue-14254.stderr | 38 +++++------ src/test/ui/resolve/issue-2356.stderr | 12 ++-- .../resolve/resolve-assoc-suggestions.stderr | 6 +- .../resolve-speculative-adjustment.stderr | 4 +- .../unresolved_static_type_field.stderr | 2 +- src/test/ui/span/issue-39018.stderr | 2 +- src/test/ui/span/suggestion-non-ascii.stderr | 2 +- .../ui/suggestions/tuple-float-index.stderr | 2 +- 13 files changed, 71 insertions(+), 89 deletions(-) diff --git a/src/test/ui-fulldeps/resolve-error.stderr b/src/test/ui-fulldeps/resolve-error.stderr index cfc15d69feb63..754f6bc4f1c1c 100644 --- a/src/test/ui-fulldeps/resolve-error.stderr +++ b/src/test/ui-fulldeps/resolve-error.stderr @@ -1,76 +1,62 @@ error: cannot find derive macro `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:36:10 + --> $DIR/resolve-error.rs:37:10 | -36 | #[derive(FooWithLongNan)] - | ^^^^^^^^^^^^^^ - | - = help: did you mean `FooWithLongName`? +37 | #[derive(FooWithLongNan)] + | ^^^^^^^^^^^^^^ help: try: `FooWithLongName` error: cannot find attribute macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:39:3 - | -39 | #[attr_proc_macra] - | ^^^^^^^^^^^^^^^ + --> $DIR/resolve-error.rs:40:3 | - = help: did you mean `attr_proc_macro`? +40 | #[attr_proc_macra] + | ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro` error: cannot find attribute macro `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:42:3 + --> $DIR/resolve-error.rs:43:3 | -42 | #[FooWithLongNan] +43 | #[FooWithLongNan] | ^^^^^^^^^^^^^^ error: cannot find derive macro `Dlone` in this scope - --> $DIR/resolve-error.rs:45:10 + --> $DIR/resolve-error.rs:46:10 | -45 | #[derive(Dlone)] - | ^^^^^ - | - = help: did you mean `Clone`? +46 | #[derive(Dlone)] + | ^^^^^ help: try: `Clone` error: cannot find derive macro `Dlona` in this scope - --> $DIR/resolve-error.rs:48:10 - | -48 | #[derive(Dlona)] - | ^^^^^ + --> $DIR/resolve-error.rs:49:10 | - = help: did you mean `Clona`? +49 | #[derive(Dlona)] + | ^^^^^ help: try: `Clona` error: cannot find derive macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:51:10 + --> $DIR/resolve-error.rs:52:10 | -51 | #[derive(attr_proc_macra)] +52 | #[derive(attr_proc_macra)] | ^^^^^^^^^^^^^^^ error: cannot find macro `FooWithLongNama!` in this scope - --> $DIR/resolve-error.rs:55:5 + --> $DIR/resolve-error.rs:56:5 | -55 | FooWithLongNama!(); - | ^^^^^^^^^^^^^^^ - | - = help: did you mean `FooWithLongNam!`? +56 | FooWithLongNama!(); + | ^^^^^^^^^^^^^^^ help: you could try the macro: `FooWithLongNam!` error: cannot find macro `attr_proc_macra!` in this scope - --> $DIR/resolve-error.rs:57:5 - | -57 | attr_proc_macra!(); - | ^^^^^^^^^^^^^^^ + --> $DIR/resolve-error.rs:58:5 | - = help: did you mean `attr_proc_mac!`? +58 | attr_proc_macra!(); + | ^^^^^^^^^^^^^^^ help: you could try the macro: `attr_proc_mac!` error: cannot find macro `Dlona!` in this scope - --> $DIR/resolve-error.rs:59:5 + --> $DIR/resolve-error.rs:60:5 | -59 | Dlona!(); +60 | Dlona!(); | ^^^^^ error: cannot find macro `bang_proc_macrp!` in this scope - --> $DIR/resolve-error.rs:61:5 - | -61 | bang_proc_macrp!(); - | ^^^^^^^^^^^^^^^ + --> $DIR/resolve-error.rs:62:5 | - = help: did you mean `bang_proc_macro!`? +62 | bang_proc_macrp!(); + | ^^^^^^^^^^^^^^^ help: you could try the macro: `bang_proc_macro!` error: aborting due to 10 previous errors diff --git a/src/test/ui/issue-35675.stderr b/src/test/ui/issue-35675.stderr index 13eeefc14aa0a..c6738e0964a1a 100644 --- a/src/test/ui/issue-35675.stderr +++ b/src/test/ui/issue-35675.stderr @@ -5,7 +5,7 @@ error[E0412]: cannot find type `Apple` in this scope | ^^^^^ | | | not found in this scope - | help: did you mean the variant's enum `Fruit` + | help: you can try using the variant's enum: `Fruit` error[E0425]: cannot find function `Apple` in this scope --> $DIR/issue-35675.rs:23:5 @@ -23,7 +23,7 @@ error[E0573]: expected type, found variant `Fruit::Apple` | ^^^^^^^^^^^^ | | | not a type - | help: did you mean the variant's enum `Fruit` + | help: you can try using the variant's enum: `Fruit` error[E0425]: cannot find function `Apple` in this scope --> $DIR/issue-35675.rs:31:5 @@ -40,8 +40,8 @@ error[E0573]: expected type, found variant `Ok` 36 | fn foo() -> Ok { | ^^ not a type | - = help: there is an enum variant `std::prelude::v1::Ok`,did you mean to use `std::prelude::v1`? - = help: there is an enum variant `std::prelude::v1::Result::Ok`,did you mean to use `std::prelude::v1::Result`? + = help: there is an enum variant `std::prelude::v1::Ok`, try using `std::prelude::v1`? + = help: there is an enum variant `std::prelude::v1::Result::Ok`, try using `std::prelude::v1::Result`? error[E0412]: cannot find type `Variant3` in this scope --> $DIR/issue-35675.rs:44:13 @@ -50,7 +50,7 @@ error[E0412]: cannot find type `Variant3` in this scope | ^^^^^^^^ | | | not found in this scope - | help: did you mean the variant's enum `x::Enum` + | help: you can try using the variant's enum: `x::Enum` error[E0573]: expected type, found variant `Some` --> $DIR/issue-35675.rs:49:13 @@ -58,8 +58,8 @@ error[E0573]: expected type, found variant `Some` 49 | fn qux() -> Some { | ^^^^ not a type | - = help: there is an enum variant `std::option::Option::Some`,did you mean to use `std::option::Option`? - = help: there is an enum variant `std::prelude::v1::Some`,did you mean to use `std::prelude::v1`? + = help: there is an enum variant `std::option::Option::Some`, try using `std::option::Option`? + = help: there is an enum variant `std::prelude::v1::Some`, try using `std::prelude::v1`? error: aborting due to 7 previous errors diff --git a/src/test/ui/issue-40402-ref-hints/issue-40402-1.stderr b/src/test/ui/issue-40402-ref-hints/issue-40402-1.stderr index de110ac12b703..26f150811b7db 100644 --- a/src/test/ui/issue-40402-ref-hints/issue-40402-1.stderr +++ b/src/test/ui/issue-40402-ref-hints/issue-40402-1.stderr @@ -4,7 +4,7 @@ error[E0507]: cannot move out of indexed content 19 | let e = f.v[0]; | ^^^^^^ | | - | help: consider using a reference instead `&f.v[0]` + | help: consider using a reference instead: `&f.v[0]` | cannot move out of indexed content error: aborting due to previous error diff --git a/src/test/ui/macros/macro-name-typo.stderr b/src/test/ui/macros/macro-name-typo.stderr index 940ad55481ed4..7c83250fe8ada 100644 --- a/src/test/ui/macros/macro-name-typo.stderr +++ b/src/test/ui/macros/macro-name-typo.stderr @@ -2,9 +2,7 @@ error: cannot find macro `printlx!` in this scope --> $DIR/macro-name-typo.rs:12:5 | 12 | printlx!("oh noes!"); - | ^^^^^^^ - | - = help: did you mean `println!`? + | ^^^^^^^ help: you could try the macro: `println!` error: aborting due to previous error diff --git a/src/test/ui/macros/macro_undefined.stderr b/src/test/ui/macros/macro_undefined.stderr index f1c2151a65c17..5c33ae99734e8 100644 --- a/src/test/ui/macros/macro_undefined.stderr +++ b/src/test/ui/macros/macro_undefined.stderr @@ -10,9 +10,7 @@ error: cannot find macro `k!` in this scope --> $DIR/macro_undefined.rs:21:5 | 21 | k!(); - | ^ - | - = help: did you mean `kl!`? + | ^ help: you could try the macro: `kl!` error: aborting due to 2 previous errors diff --git a/src/test/ui/resolve/issue-14254.stderr b/src/test/ui/resolve/issue-14254.stderr index 3d9668b62d533..3b5f3e4c36a04 100644 --- a/src/test/ui/resolve/issue-14254.stderr +++ b/src/test/ui/resolve/issue-14254.stderr @@ -2,7 +2,7 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:29:9 | 29 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `a` in this scope --> $DIR/issue-14254.rs:32:9 @@ -14,19 +14,19 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:40:9 | 40 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `x` in this scope --> $DIR/issue-14254.rs:43:9 | 43 | x; - | ^ help: did you mean `self.x` + | ^ help: try: `self.x` error[E0425]: cannot find value `y` in this scope --> $DIR/issue-14254.rs:46:9 | 46 | y; - | ^ help: did you mean `self.y` + | ^ help: try: `self.y` error[E0425]: cannot find value `a` in this scope --> $DIR/issue-14254.rs:49:9 @@ -38,7 +38,7 @@ error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:52:9 | 52 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error[E0425]: cannot find value `b` in this scope --> $DIR/issue-14254.rs:55:9 @@ -50,19 +50,19 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:63:9 | 63 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `x` in this scope --> $DIR/issue-14254.rs:66:9 | 66 | x; - | ^ help: did you mean `self.x` + | ^ help: try: `self.x` error[E0425]: cannot find value `y` in this scope --> $DIR/issue-14254.rs:69:9 | 69 | y; - | ^ help: did you mean `self.y` + | ^ help: try: `self.y` error[E0425]: cannot find value `a` in this scope --> $DIR/issue-14254.rs:72:9 @@ -74,7 +74,7 @@ error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:75:9 | 75 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error[E0425]: cannot find value `b` in this scope --> $DIR/issue-14254.rs:78:9 @@ -86,61 +86,61 @@ error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:86:9 | 86 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:89:9 | 89 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:97:9 | 97 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:100:9 | 100 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:108:9 | 108 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:111:9 | 111 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:119:9 | 119 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:122:9 | 122 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error[E0425]: cannot find function `baz` in this scope --> $DIR/issue-14254.rs:130:9 | 130 | baz(); - | ^^^ help: did you mean `self.baz` + | ^^^ help: try: `self.baz` error[E0425]: cannot find value `bah` in this scope --> $DIR/issue-14254.rs:133:9 | 133 | bah; - | ^^^ help: did you mean `Self::bah` + | ^^^ help: try: `Self::bah` error: main function not found diff --git a/src/test/ui/resolve/issue-2356.stderr b/src/test/ui/resolve/issue-2356.stderr index 609c880a592e3..9c683f4418972 100644 --- a/src/test/ui/resolve/issue-2356.stderr +++ b/src/test/ui/resolve/issue-2356.stderr @@ -8,13 +8,13 @@ error[E0425]: cannot find function `clone` in this scope --> $DIR/issue-2356.rs:35:5 | 35 | clone(); - | ^^^^^ help: did you mean `self.clone` + | ^^^^^ help: try: `self.clone` error[E0425]: cannot find function `default` in this scope --> $DIR/issue-2356.rs:43:5 | 43 | default(); - | ^^^^^^^ help: did you mean `Self::default` + | ^^^^^^^ help: try: `Self::default` error[E0425]: cannot find value `whiskers` in this scope --> $DIR/issue-2356.rs:52:5 @@ -22,14 +22,14 @@ error[E0425]: cannot find value `whiskers` in this scope 52 | whiskers -= other; | ^^^^^^^^ | | - | help: did you mean `self.whiskers` + | help: try: `self.whiskers` | `self` value is only available in methods with `self` parameter error[E0425]: cannot find function `shave` in this scope --> $DIR/issue-2356.rs:57:5 | 57 | shave(4); - | ^^^^^ help: did you mean `Self::shave` + | ^^^^^ help: try: `Self::shave` error[E0425]: cannot find function `purr` in this scope --> $DIR/issue-2356.rs:60:5 @@ -83,7 +83,7 @@ error[E0425]: cannot find value `whiskers` in this scope --> $DIR/issue-2356.rs:104:5 | 104 | whiskers = 0; - | ^^^^^^^^ help: did you mean `self.whiskers` + | ^^^^^^^^ help: try: `self.whiskers` error[E0425]: cannot find value `whiskers` in this scope --> $DIR/issue-2356.rs:110:5 @@ -91,7 +91,7 @@ error[E0425]: cannot find value `whiskers` in this scope 110 | whiskers = 4; | ^^^^^^^^ | | - | help: did you mean `self.whiskers` + | help: try: `self.whiskers` | `self` value is only available in methods with `self` parameter error[E0425]: cannot find function `purr_louder` in this scope diff --git a/src/test/ui/resolve/resolve-assoc-suggestions.stderr b/src/test/ui/resolve/resolve-assoc-suggestions.stderr index 9ee715718e402..77aa545e2ad6b 100644 --- a/src/test/ui/resolve/resolve-assoc-suggestions.stderr +++ b/src/test/ui/resolve/resolve-assoc-suggestions.stderr @@ -14,13 +14,13 @@ error[E0425]: cannot find value `field` in this scope --> $DIR/resolve-assoc-suggestions.rs:32:9 | 32 | field; - | ^^^^^ help: did you mean `self.field` + | ^^^^^ help: try: `self.field` error[E0412]: cannot find type `Type` in this scope --> $DIR/resolve-assoc-suggestions.rs:36:16 | 36 | let _: Type; - | ^^^^ help: did you mean `Self::Type` + | ^^^^ help: try: `Self::Type` error[E0531]: cannot find tuple struct/variant `Type` in this scope --> $DIR/resolve-assoc-suggestions.rs:39:13 @@ -50,7 +50,7 @@ error[E0425]: cannot find value `method` in this scope --> $DIR/resolve-assoc-suggestions.rs:52:9 | 52 | method; - | ^^^^^^ help: did you mean `self.method` + | ^^^^^^ help: try: `self.method` error: aborting due to 9 previous errors diff --git a/src/test/ui/resolve/resolve-speculative-adjustment.stderr b/src/test/ui/resolve/resolve-speculative-adjustment.stderr index 05601a825c85e..3e1b075679a50 100644 --- a/src/test/ui/resolve/resolve-speculative-adjustment.stderr +++ b/src/test/ui/resolve/resolve-speculative-adjustment.stderr @@ -14,13 +14,13 @@ error[E0425]: cannot find value `field` in this scope --> $DIR/resolve-speculative-adjustment.rs:35:9 | 35 | field; - | ^^^^^ help: did you mean `self.field` + | ^^^^^ help: try: `self.field` error[E0425]: cannot find function `method` in this scope --> $DIR/resolve-speculative-adjustment.rs:38:9 | 38 | method(); - | ^^^^^^ help: did you mean `self.method` + | ^^^^^^ help: try: `self.method` error: aborting due to 4 previous errors diff --git a/src/test/ui/resolve/unresolved_static_type_field.stderr b/src/test/ui/resolve/unresolved_static_type_field.stderr index 94b9bca776161..e598851e3628e 100644 --- a/src/test/ui/resolve/unresolved_static_type_field.stderr +++ b/src/test/ui/resolve/unresolved_static_type_field.stderr @@ -4,7 +4,7 @@ error[E0425]: cannot find value `cx` in this scope 19 | f(cx); | ^^ | | - | help: did you mean `self.cx` + | help: try: `self.cx` | `self` value is only available in methods with `self` parameter error: aborting due to previous error diff --git a/src/test/ui/span/issue-39018.stderr b/src/test/ui/span/issue-39018.stderr index cd3a41b037c79..e8b3c6629bd53 100644 --- a/src/test/ui/span/issue-39018.stderr +++ b/src/test/ui/span/issue-39018.stderr @@ -4,7 +4,7 @@ error[E0369]: binary operation `+` cannot be applied to type `&'static str` 12 | let x = "Hello " + "World!"; | ^^^^^^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings | -help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left. +help: `to_owned()` can be used to create an owned `String` from a string reference. String concatenation appends the string on the right to the string on the left and may require reallocation. This requires ownership of the string on the left | let x = "Hello ".to_owned() + "World!"; error[E0369]: binary operation `+` cannot be applied to type `World` diff --git a/src/test/ui/span/suggestion-non-ascii.stderr b/src/test/ui/span/suggestion-non-ascii.stderr index 91e629c44b073..48db5026c9e51 100644 --- a/src/test/ui/span/suggestion-non-ascii.stderr +++ b/src/test/ui/span/suggestion-non-ascii.stderr @@ -2,7 +2,7 @@ error: cannot index a value of type `({integer},)` --> $DIR/suggestion-non-ascii.rs:14:21 | 14 | println!("☃{}", tup[0]); - | ^^^^^^ help: to access tuple elements, use `tup.0` + | ^^^^^^ help: to access tuple elements, use: `tup.0` error: aborting due to previous error diff --git a/src/test/ui/suggestions/tuple-float-index.stderr b/src/test/ui/suggestions/tuple-float-index.stderr index 8a121b1453662..4b1be26c86b0e 100644 --- a/src/test/ui/suggestions/tuple-float-index.stderr +++ b/src/test/ui/suggestions/tuple-float-index.stderr @@ -5,7 +5,7 @@ error: unexpected token: `1.1` | ------------^^^ | | | | | unexpected token - | help: try parenthesizing the first index `((1, (2, 3)).1).1` + | help: try parenthesizing the first index: `((1, (2, 3)).1).1` error: aborting due to previous error From 9d41d0eb9506bc07f90db1430237a88c711563a9 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 18 May 2017 17:27:10 +0200 Subject: [PATCH 10/24] Move a compile-fail test to ui --- .../cast-to-unsized-trait-object-suggestion.rs | 6 ------ ...t-to-unsized-trait-object-suggestion.stderr | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) rename src/test/{compile-fail => ui}/cast-to-unsized-trait-object-suggestion.rs (67%) create mode 100644 src/test/ui/cast-to-unsized-trait-object-suggestion.stderr diff --git a/src/test/compile-fail/cast-to-unsized-trait-object-suggestion.rs b/src/test/ui/cast-to-unsized-trait-object-suggestion.rs similarity index 67% rename from src/test/compile-fail/cast-to-unsized-trait-object-suggestion.rs rename to src/test/ui/cast-to-unsized-trait-object-suggestion.rs index d18746cdf0ba5..c793454798275 100644 --- a/src/test/compile-fail/cast-to-unsized-trait-object-suggestion.rs +++ b/src/test/ui/cast-to-unsized-trait-object-suggestion.rs @@ -10,11 +10,5 @@ fn main() { &1 as Send; - //~^ ERROR cast to unsized type - //~| HELP try casting to a reference instead: - //~| SUGGESTION &1 as &Send; Box::new(1) as Send; - //~^ ERROR cast to unsized type - //~| HELP try casting to a `Box` instead: - //~| SUGGESTION Box::new(1) as Box; } diff --git a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr new file mode 100644 index 0000000000000..f871fad5ee7f6 --- /dev/null +++ b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr @@ -0,0 +1,18 @@ +error: cast to unsized type: `&{integer}` as `std::marker::Send` + --> $DIR/cast-to-unsized-trait-object-suggestion.rs:12:5 + | +12 | &1 as Send; + | ^^^^^^---- + | | + | help: try casting to a reference instead: `&Send` + +error: cast to unsized type: `std::boxed::Box<{integer}>` as `std::marker::Send` + --> $DIR/cast-to-unsized-trait-object-suggestion.rs:16:5 + | +16 | Box::new(1) as Send; + | ^^^^^^^^^^^^^^^---- + | | + | help: try casting to a `Box` instead: `Box` + +error: aborting due to 2 previous errors + From bff4795e86e3f7647d58db944ebb43ea1ce8ae4d Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 18 May 2017 17:54:40 +0200 Subject: [PATCH 11/24] Tidy errors --- src/librustc_resolve/lib.rs | 3 ++- src/librustc_resolve/macros.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 650fc8c7e8065..d37cb48b8c1f9 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2314,7 +2314,8 @@ impl<'a> Resolver<'a> { enum_path); err.help(&msg); } else { - err.span_suggestion(span, "you can try using the variant's enum", enum_path); + err.span_suggestion(span, "you can try using the variant's enum", + enum_path); } } } diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 9951fa20920c9..96783ba0cde64 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -649,7 +649,8 @@ impl<'a> Resolver<'a> { if let Some(suggestion) = suggestion { if suggestion != name { if let MacroKind::Bang = kind { - err.span_suggestion(span, "you could try the macro", format!("{}!", suggestion)); + err.span_suggestion(span, "you could try the macro", + format!("{}!", suggestion)); } else { err.span_suggestion(span, "try", suggestion.to_string()); } From 6f681c2caecfa466c184407b8decf1f48399bd37 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Mon, 22 May 2017 12:44:24 +0200 Subject: [PATCH 12/24] Fix line numbers in ui test --- src/test/ui/cast-to-unsized-trait-object-suggestion.stderr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr index f871fad5ee7f6..5a7d7500e4b92 100644 --- a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr +++ b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr @@ -7,9 +7,9 @@ error: cast to unsized type: `&{integer}` as `std::marker::Send` | help: try casting to a reference instead: `&Send` error: cast to unsized type: `std::boxed::Box<{integer}>` as `std::marker::Send` - --> $DIR/cast-to-unsized-trait-object-suggestion.rs:16:5 + --> $DIR/cast-to-unsized-trait-object-suggestion.rs:13:5 | -16 | Box::new(1) as Send; +13 | Box::new(1) as Send; | ^^^^^^^^^^^^^^^---- | | | help: try casting to a `Box` instead: `Box` From 1343bc649846e3c3e28ca752234cc13bda2a2e96 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Mon, 22 May 2017 15:00:09 +0200 Subject: [PATCH 13/24] Readd //~ERROR messages --- src/test/ui-fulldeps/resolve-error.rs | 10 ++++ ...cast-to-unsized-trait-object-suggestion.rs | 2 + ...-to-unsized-trait-object-suggestion.stderr | 4 +- src/test/ui/macros/macro-name-typo.rs | 1 + src/test/ui/macros/macro_undefined.rs | 2 + src/test/ui/macros/macro_undefined.stderr | 4 +- src/test/ui/resolve-error.stderr | 54 +++++++++---------- 7 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/test/ui-fulldeps/resolve-error.rs b/src/test/ui-fulldeps/resolve-error.rs index dfaa1d7a32e57..8efcd8081feac 100644 --- a/src/test/ui-fulldeps/resolve-error.rs +++ b/src/test/ui-fulldeps/resolve-error.rs @@ -35,29 +35,39 @@ macro_rules! attr_proc_mac { } #[derive(FooWithLongNan)] +//~^ ERROR cannot find derive macro `FooWithLongNan` in this scope struct Foo; #[attr_proc_macra] +//~^ ERROR cannot find attribute macro `attr_proc_macra` in this scope struct Bar; #[FooWithLongNan] +//~^ ERROR cannot find attribute macro `FooWithLongNan` in this scope struct Asdf; #[derive(Dlone)] +//~^ ERROR cannot find derive macro `Dlone` in this scope struct A; #[derive(Dlona)] +//~^ ERROR cannot find derive macro `Dlona` in this scope struct B; #[derive(attr_proc_macra)] +//~^ ERROR cannot find derive macro `attr_proc_macra` in this scope struct C; fn main() { FooWithLongNama!(); + //~^ ERROR cannot find macro `FooWithLongNama!` in this scope attr_proc_macra!(); + //~^ ERROR cannot find macro `attr_proc_macra!` in this scope Dlona!(); + //~^ ERROR cannot find macro `Dlona!` in this scope bang_proc_macrp!(); + //~^ ERROR cannot find macro `bang_proc_macrp!` in this scope } diff --git a/src/test/ui/cast-to-unsized-trait-object-suggestion.rs b/src/test/ui/cast-to-unsized-trait-object-suggestion.rs index c793454798275..3693fd11d4837 100644 --- a/src/test/ui/cast-to-unsized-trait-object-suggestion.rs +++ b/src/test/ui/cast-to-unsized-trait-object-suggestion.rs @@ -10,5 +10,7 @@ fn main() { &1 as Send; + //~^ ERROR cast to unsized type Box::new(1) as Send; + //~^ ERROR cast to unsized type } diff --git a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr index 5a7d7500e4b92..6aa062e42238a 100644 --- a/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr +++ b/src/test/ui/cast-to-unsized-trait-object-suggestion.stderr @@ -7,9 +7,9 @@ error: cast to unsized type: `&{integer}` as `std::marker::Send` | help: try casting to a reference instead: `&Send` error: cast to unsized type: `std::boxed::Box<{integer}>` as `std::marker::Send` - --> $DIR/cast-to-unsized-trait-object-suggestion.rs:13:5 + --> $DIR/cast-to-unsized-trait-object-suggestion.rs:14:5 | -13 | Box::new(1) as Send; +14 | Box::new(1) as Send; | ^^^^^^^^^^^^^^^---- | | | help: try casting to a `Box` instead: `Box` diff --git a/src/test/ui/macros/macro-name-typo.rs b/src/test/ui/macros/macro-name-typo.rs index ec8d27f9138f7..7489d92dc2411 100644 --- a/src/test/ui/macros/macro-name-typo.rs +++ b/src/test/ui/macros/macro-name-typo.rs @@ -10,4 +10,5 @@ fn main() { printlx!("oh noes!"); + //~^ ERROR cannot find macro } diff --git a/src/test/ui/macros/macro_undefined.rs b/src/test/ui/macros/macro_undefined.rs index db93ba5e2c41d..ac3c356b54999 100644 --- a/src/test/ui/macros/macro_undefined.rs +++ b/src/test/ui/macros/macro_undefined.rs @@ -19,5 +19,7 @@ mod m { fn main() { k!(); + //~^ ERROR cannot find macro `k!` in this scope kl!(); + //~^ ERROR cannot find macro `kl!` in this scope } diff --git a/src/test/ui/macros/macro_undefined.stderr b/src/test/ui/macros/macro_undefined.stderr index 5c33ae99734e8..b88829c2e23e0 100644 --- a/src/test/ui/macros/macro_undefined.stderr +++ b/src/test/ui/macros/macro_undefined.stderr @@ -1,7 +1,7 @@ error: cannot find macro `kl!` in this scope - --> $DIR/macro_undefined.rs:22:5 + --> $DIR/macro_undefined.rs:23:5 | -22 | kl!(); +23 | kl!(); | ^^ | = help: have you added the `#[macro_use]` on the module/import? diff --git a/src/test/ui/resolve-error.stderr b/src/test/ui/resolve-error.stderr index 788e53ad85e55..be7ebae70adf5 100644 --- a/src/test/ui/resolve-error.stderr +++ b/src/test/ui/resolve-error.stderr @@ -1,62 +1,62 @@ error: cannot find derive macro `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:36:10 + --> $DIR/resolve-error.rs:37:10 | -36 | #[derive(FooWithLongNan)] - | ^^^^^^^^^^^^^^ help: did you mean `FooWithLongName` +37 | #[derive(FooWithLongNan)] + | ^^^^^^^^^^^^^^ help: try: `FooWithLongName` error: cannot find attribute macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:39:3 + --> $DIR/resolve-error.rs:41:3 | -39 | #[attr_proc_macra] - | ^^^^^^^^^^^^^^^ help: did you mean `attr_proc_macro` +41 | #[attr_proc_macra] + | ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro` error: cannot find attribute macro `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:42:3 + --> $DIR/resolve-error.rs:45:3 | -42 | #[FooWithLongNan] +45 | #[FooWithLongNan] | ^^^^^^^^^^^^^^ error: cannot find derive macro `Dlone` in this scope - --> $DIR/resolve-error.rs:45:10 + --> $DIR/resolve-error.rs:49:10 | -45 | #[derive(Dlone)] - | ^^^^^ help: did you mean `Clone` +49 | #[derive(Dlone)] + | ^^^^^ help: try: `Clone` error: cannot find derive macro `Dlona` in this scope - --> $DIR/resolve-error.rs:48:10 + --> $DIR/resolve-error.rs:53:10 | -48 | #[derive(Dlona)] - | ^^^^^ help: did you mean `Clona` +53 | #[derive(Dlona)] + | ^^^^^ help: try: `Clona` error: cannot find derive macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:51:10 + --> $DIR/resolve-error.rs:57:10 | -51 | #[derive(attr_proc_macra)] +57 | #[derive(attr_proc_macra)] | ^^^^^^^^^^^^^^^ error: cannot find macro `FooWithLongNama!` in this scope - --> $DIR/resolve-error.rs:55:5 + --> $DIR/resolve-error.rs:62:5 | -55 | FooWithLongNama!(); - | ^^^^^^^^^^^^^^^ help: did you mean `FooWithLongNam!` +62 | FooWithLongNama!(); + | ^^^^^^^^^^^^^^^ help: you could try the macro: `FooWithLongNam!` error: cannot find macro `attr_proc_macra!` in this scope - --> $DIR/resolve-error.rs:57:5 + --> $DIR/resolve-error.rs:65:5 | -57 | attr_proc_macra!(); - | ^^^^^^^^^^^^^^^ help: did you mean `attr_proc_mac!` +65 | attr_proc_macra!(); + | ^^^^^^^^^^^^^^^ help: you could try the macro: `attr_proc_mac!` error: cannot find macro `Dlona!` in this scope - --> $DIR/resolve-error.rs:59:5 + --> $DIR/resolve-error.rs:68:5 | -59 | Dlona!(); +68 | Dlona!(); | ^^^^^ error: cannot find macro `bang_proc_macrp!` in this scope - --> $DIR/resolve-error.rs:61:5 + --> $DIR/resolve-error.rs:71:5 | -61 | bang_proc_macrp!(); - | ^^^^^^^^^^^^^^^ help: did you mean `bang_proc_macro!` +71 | bang_proc_macrp!(); + | ^^^^^^^^^^^^^^^ help: you could try the macro: `bang_proc_macro!` error: aborting due to 10 previous errors From 14b767d07e15e66203429f674315727a47e01ed5 Mon Sep 17 00:00:00 2001 From: Havvy Date: Mon, 22 May 2017 15:06:25 -0700 Subject: [PATCH 14/24] Add example of recursive drop to Drop trait. --- src/libcore/ops.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index fc3af096b1838..4c2d05accf389 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -153,6 +153,8 @@ use marker::Unsize; /// The `Drop` trait is used to run some code when a value goes out of scope. /// This is sometimes called a 'destructor'. /// +/// +/// /// # Examples /// /// A trivial implementation of `Drop`. The `drop` method is called when `_x` @@ -171,6 +173,32 @@ use marker::Unsize; /// let _x = HasDrop; /// } /// ``` +/// +/// Showing the recursive nature of `Drop`. When `outer` goes out of scope, the +/// `drop` method will be called for `Outer` and then the `drop` method for +/// `Inner` will be called. Therefore `main` prints `Dropping Outer!` and then +/// `Dropping Inner!`. +/// +/// ``` +/// struct Inner; +/// struct Outer(Inner); +/// +/// impl Drop for Inner { +/// fn drop(&mut self) { +/// println!("Dropping Inner!"); +/// } +/// } +/// +/// impl Drop for Outer { +/// fn drop(&mut self) { +/// println!("Dropping Outer!"); +/// } +/// } +/// +/// fn main() { +/// let _x = Outer(Inner); +/// } +/// ``` #[lang = "drop"] #[stable(feature = "rust1", since = "1.0.0")] pub trait Drop { From ca909c836fb509bcda5471cdeef0dd9ccd00c54d Mon Sep 17 00:00:00 2001 From: Havvy Date: Mon, 22 May 2017 15:15:04 -0700 Subject: [PATCH 15/24] Add example of variable declaration drop order to Drop trait. --- src/libcore/ops.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index 4c2d05accf389..a2cdd646bd43a 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -199,6 +199,18 @@ use marker::Unsize; /// let _x = Outer(Inner); /// } /// ``` +/// +/// Because variables are dropped in the reverse order they are declared, +/// `main` will print `Declared second!` and then `Declared first!`. +/// +/// ``` +/// struct PrintOnDrop(&'static str); +/// +/// fn main() { +/// let _first = PrintOnDrop("Declared first!"); +/// let _second = PrintOnDrop("Declared second!"); +/// } +/// ``` #[lang = "drop"] #[stable(feature = "rust1", since = "1.0.0")] pub trait Drop { From d7927ffb8f55e8a292c5d933325660141f0aab4e Mon Sep 17 00:00:00 2001 From: Havvy Date: Mon, 22 May 2017 15:59:00 -0700 Subject: [PATCH 16/24] Add description of how values are dropped to Drop trait. --- src/libcore/ops.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index a2cdd646bd43a..f2385cfcd787b 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -153,7 +153,13 @@ use marker::Unsize; /// The `Drop` trait is used to run some code when a value goes out of scope. /// This is sometimes called a 'destructor'. /// -/// +/// When a value goes out of scope, if it implements this trait, it will have +/// its `drop` method called. Then any fields the value contains will also +/// be dropped recursively. +/// +/// Because of the recursive dropping, even for types that do not implement +/// this trait, you do not need to implement this trait unless your type +/// needs its own destructor logic. /// /// # Examples /// From 5f4b0ffe59c1c0358ea3e5b9c1ad5fdb7b135b96 Mon Sep 17 00:00:00 2001 From: Havvy Date: Mon, 22 May 2017 16:33:55 -0700 Subject: [PATCH 17/24] Fix trailing whitespace. --- src/libcore/ops.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index f2385cfcd787b..dd1990784c404 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -184,7 +184,7 @@ use marker::Unsize; /// `drop` method will be called for `Outer` and then the `drop` method for /// `Inner` will be called. Therefore `main` prints `Dropping Outer!` and then /// `Dropping Inner!`. -/// +/// /// ``` /// struct Inner; /// struct Outer(Inner); @@ -211,7 +211,7 @@ use marker::Unsize; /// /// ``` /// struct PrintOnDrop(&'static str); -/// +/// /// fn main() { /// let _first = PrintOnDrop("Declared first!"); /// let _second = PrintOnDrop("Declared second!"); From 72eb0108c8bf8426ba8c4e4a26cd446051ba2c47 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 23 May 2017 08:00:47 +0200 Subject: [PATCH 18/24] update-all-references.sh doesn't deterministically work on ui-fulldeps --- src/test/ui-fulldeps/resolve-error.stderr | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/test/ui-fulldeps/resolve-error.stderr b/src/test/ui-fulldeps/resolve-error.stderr index 754f6bc4f1c1c..be7ebae70adf5 100644 --- a/src/test/ui-fulldeps/resolve-error.stderr +++ b/src/test/ui-fulldeps/resolve-error.stderr @@ -5,57 +5,57 @@ error: cannot find derive macro `FooWithLongNan` in this scope | ^^^^^^^^^^^^^^ help: try: `FooWithLongName` error: cannot find attribute macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:40:3 + --> $DIR/resolve-error.rs:41:3 | -40 | #[attr_proc_macra] +41 | #[attr_proc_macra] | ^^^^^^^^^^^^^^^ help: try: `attr_proc_macro` error: cannot find attribute macro `FooWithLongNan` in this scope - --> $DIR/resolve-error.rs:43:3 + --> $DIR/resolve-error.rs:45:3 | -43 | #[FooWithLongNan] +45 | #[FooWithLongNan] | ^^^^^^^^^^^^^^ error: cannot find derive macro `Dlone` in this scope - --> $DIR/resolve-error.rs:46:10 + --> $DIR/resolve-error.rs:49:10 | -46 | #[derive(Dlone)] +49 | #[derive(Dlone)] | ^^^^^ help: try: `Clone` error: cannot find derive macro `Dlona` in this scope - --> $DIR/resolve-error.rs:49:10 + --> $DIR/resolve-error.rs:53:10 | -49 | #[derive(Dlona)] +53 | #[derive(Dlona)] | ^^^^^ help: try: `Clona` error: cannot find derive macro `attr_proc_macra` in this scope - --> $DIR/resolve-error.rs:52:10 + --> $DIR/resolve-error.rs:57:10 | -52 | #[derive(attr_proc_macra)] +57 | #[derive(attr_proc_macra)] | ^^^^^^^^^^^^^^^ error: cannot find macro `FooWithLongNama!` in this scope - --> $DIR/resolve-error.rs:56:5 + --> $DIR/resolve-error.rs:62:5 | -56 | FooWithLongNama!(); +62 | FooWithLongNama!(); | ^^^^^^^^^^^^^^^ help: you could try the macro: `FooWithLongNam!` error: cannot find macro `attr_proc_macra!` in this scope - --> $DIR/resolve-error.rs:58:5 + --> $DIR/resolve-error.rs:65:5 | -58 | attr_proc_macra!(); +65 | attr_proc_macra!(); | ^^^^^^^^^^^^^^^ help: you could try the macro: `attr_proc_mac!` error: cannot find macro `Dlona!` in this scope - --> $DIR/resolve-error.rs:60:5 + --> $DIR/resolve-error.rs:68:5 | -60 | Dlona!(); +68 | Dlona!(); | ^^^^^ error: cannot find macro `bang_proc_macrp!` in this scope - --> $DIR/resolve-error.rs:62:5 + --> $DIR/resolve-error.rs:71:5 | -62 | bang_proc_macrp!(); +71 | bang_proc_macrp!(); | ^^^^^^^^^^^^^^^ help: you could try the macro: `bang_proc_macro!` error: aborting due to 10 previous errors From b41b2947d56ce8be0b927d59d766a23271b9dd37 Mon Sep 17 00:00:00 2001 From: Havvy Date: Mon, 22 May 2017 23:49:35 -0700 Subject: [PATCH 19/24] Suggested changes by birkenfeld --- src/libcore/ops.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index dd1990784c404..4fb1f1757bbf7 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -157,9 +157,8 @@ use marker::Unsize; /// its `drop` method called. Then any fields the value contains will also /// be dropped recursively. /// -/// Because of the recursive dropping, even for types that do not implement -/// this trait, you do not need to implement this trait unless your type -/// needs its own destructor logic. +/// Because of the recursive dropping, you do not need to implement this trait +/// unless your type needs its own destructor logic. /// /// # Examples /// @@ -181,9 +180,8 @@ use marker::Unsize; /// ``` /// /// Showing the recursive nature of `Drop`. When `outer` goes out of scope, the -/// `drop` method will be called for `Outer` and then the `drop` method for -/// `Inner` will be called. Therefore `main` prints `Dropping Outer!` and then -/// `Dropping Inner!`. +/// `drop` method will be called first for `Outer`, then for `Inner`. Therefore +/// `main` prints `Dropping Outer!` and then `Dropping Inner!`. /// /// ``` /// struct Inner; From 57f260d41895ec6aa4f00412287c6fdfe63aa23f Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Tue, 23 May 2017 02:24:25 -0700 Subject: [PATCH 20/24] Override size_hint and propagate ExactSizeIterator for iter::StepBy Generally useful, but also a prerequisite for moving a bunch of unit tests off Range::step_by. --- src/libcore/iter/mod.rs | 19 ++++++++++ src/libcore/tests/iter.rs | 73 +++++++++++++++++++++++++++++++++++++++ src/libcore/tests/lib.rs | 2 ++ 3 files changed, 94 insertions(+) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 420ff0f71193b..a3b755a38f3d0 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -553,8 +553,27 @@ impl Iterator for StepBy where I: Iterator { self.iter.nth(self.step) } } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let inner_hint = self.iter.size_hint(); + + if self.first_take { + let f = |n| if n == 0 { 0 } else { 1 + (n-1)/(self.step+1) }; + (f(inner_hint.0), inner_hint.1.map(f)) + } else { + let f = |n| n / (self.step+1); + (f(inner_hint.0), inner_hint.1.map(f)) + } + } } +// StepBy can only make the iterator shorter, so the len will still fit. +#[unstable(feature = "iterator_step_by", + reason = "unstable replacement of Range::step_by", + issue = "27741")] +impl ExactSizeIterator for StepBy where I: ExactSizeIterator {} + /// An iterator that strings two iterators together. /// /// This `struct` is created by the [`chain`] method on [`Iterator`]. See its diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs index ad91ba9be58f2..4030eaf2b2333 100644 --- a/src/libcore/tests/iter.rs +++ b/src/libcore/tests/iter.rs @@ -171,6 +171,79 @@ fn test_iterator_step_by_zero() { it.next(); } +#[test] +fn test_iterator_step_by_size_hint() { + struct StubSizeHint(usize, Option); + impl Iterator for StubSizeHint { + type Item = (); + fn next(&mut self) -> Option<()> { + self.0 -= 1; + if let Some(ref mut upper) = self.1 { + *upper -= 1; + } + Some(()) + } + fn size_hint(&self) -> (usize, Option) { + (self.0, self.1) + } + } + + // The two checks in each case are needed because the logic + // is different before the first call to `next()`. + + let mut it = StubSizeHint(10, Some(10)).step_by(1); + assert_eq!(it.size_hint(), (10, Some(10))); + it.next(); + assert_eq!(it.size_hint(), (9, Some(9))); + + // exact multiple + let mut it = StubSizeHint(10, Some(10)).step_by(3); + assert_eq!(it.size_hint(), (4, Some(4))); + it.next(); + assert_eq!(it.size_hint(), (3, Some(3))); + + // larger base range, but not enough to get another element + let mut it = StubSizeHint(12, Some(12)).step_by(3); + assert_eq!(it.size_hint(), (4, Some(4))); + it.next(); + assert_eq!(it.size_hint(), (3, Some(3))); + + // smaller base range, so fewer resulting elements + let mut it = StubSizeHint(9, Some(9)).step_by(3); + assert_eq!(it.size_hint(), (3, Some(3))); + it.next(); + assert_eq!(it.size_hint(), (2, Some(2))); + + // infinite upper bound + let mut it = StubSizeHint(usize::MAX, None).step_by(1); + assert_eq!(it.size_hint(), (usize::MAX, None)); + it.next(); + assert_eq!(it.size_hint(), (usize::MAX-1, None)); + + // still infinite with larger step + let mut it = StubSizeHint(7, None).step_by(3); + assert_eq!(it.size_hint(), (3, None)); + it.next(); + assert_eq!(it.size_hint(), (2, None)); + + // propagates ExactSizeIterator + let a = [1,2,3,4,5]; + let it = a.iter().step_by(2); + assert_eq!(it.len(), 3); + + // Cannot be TrustedLen as a step greater than one makes an iterator + // with (usize::MAX, None) no longer meet the safety requirements + trait TrustedLenCheck { fn test(self) -> bool; } + impl TrustedLenCheck for T { + default fn test(self) -> bool { false } + } + impl TrustedLenCheck for T { + fn test(self) -> bool { true } + } + assert!(TrustedLenCheck::test(a.iter())); + assert!(!TrustedLenCheck::test(a.iter().step_by(1))); +} + #[test] fn test_filter_map() { let it = (0..).step_by(1).take(10) diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs index c52155ead4f0b..d5d7d0f40b210 100644 --- a/src/libcore/tests/lib.rs +++ b/src/libcore/tests/lib.rs @@ -31,9 +31,11 @@ #![feature(slice_patterns)] #![feature(sort_internals)] #![feature(sort_unstable)] +#![feature(specialization)] #![feature(step_by)] #![feature(step_trait)] #![feature(test)] +#![feature(trusted_len)] #![feature(try_from)] #![feature(unicode)] #![feature(unique)] From 4be488c06581448abb9ad8cfc98fa32bcf72244d Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 20 May 2017 18:05:18 -0700 Subject: [PATCH 21/24] Add iterator_step_by to the unstable book's summary --- src/doc/unstable-book/src/SUMMARY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/doc/unstable-book/src/SUMMARY.md b/src/doc/unstable-book/src/SUMMARY.md index 39f800591483b..50efcd06220b3 100644 --- a/src/doc/unstable-book/src/SUMMARY.md +++ b/src/doc/unstable-book/src/SUMMARY.md @@ -156,6 +156,7 @@ - [io](library-features/io.md) - [ip](library-features/ip.md) - [iter_rfind](library-features/iter-rfind.md) + - [iterator_step_by](library-features/iterator-step-by.md) - [libstd_io_internals](library-features/libstd-io-internals.md) - [libstd_sys_internals](library-features/libstd-sys-internals.md) - [libstd_thread_internals](library-features/libstd-thread-internals.md) From fcb3a7109c84f48c4f60504255dd3f375818fdfd Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 20 May 2017 18:32:43 -0700 Subject: [PATCH 22/24] Update description of iter::StepBy --- src/libcore/iter/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index a3b755a38f3d0..f87bbfbd7d9ae 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -520,7 +520,7 @@ impl Iterator for Cycle where I: Clone + Iterator { #[unstable(feature = "fused", issue = "35602")] impl FusedIterator for Cycle where I: Clone + Iterator {} -/// An iterator that steps by n elements every iteration. +/// An adapter for stepping iterators by a custom amount. /// /// This `struct` is created by the [`step_by`] method on [`Iterator`]. See /// its documentation for more. From 794e5724a871e2414c0b39b9d99bc5a084d31dfd Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Tue, 23 May 2017 03:08:18 -0700 Subject: [PATCH 23/24] Give step_trait a distinct tracking issue from step_by iterator_step_by has decoupled their futures, so the tracking issue should split. --- src/doc/unstable-book/src/library-features/step-trait.md | 4 ++-- src/libcore/iter/mod.rs | 2 +- src/libcore/iter/range.rs | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/doc/unstable-book/src/library-features/step-trait.md b/src/doc/unstable-book/src/library-features/step-trait.md index e53ca13f7b6f5..56050c20c6915 100644 --- a/src/doc/unstable-book/src/library-features/step-trait.md +++ b/src/doc/unstable-book/src/library-features/step-trait.md @@ -1,7 +1,7 @@ # `step_trait` -The tracking issue for this feature is: [#27741] +The tracking issue for this feature is: [#42168] -[#27741]: https://github.com/rust-lang/rust/issues/27741 +[#42168]: https://github.com/rust-lang/rust/issues/42168 ------------------------ diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 420ff0f71193b..785c26efdc804 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -309,7 +309,7 @@ pub use self::iterator::Iterator; #[unstable(feature = "step_trait", reason = "likely to be replaced by finer-grained traits", - issue = "27741")] + issue = "42168")] pub use self::range::Step; #[unstable(feature = "step_by", reason = "recent addition", issue = "27741")] diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index bd831d638c0c4..8d370f9675f3e 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -20,7 +20,7 @@ use super::{FusedIterator, TrustedLen}; /// two `Step` objects. #[unstable(feature = "step_trait", reason = "likely to be replaced by finer-grained traits", - issue = "27741")] + issue = "42168")] pub trait Step: PartialOrd + Sized { /// Steps `self` if possible. fn step(&self, by: &Self) -> Option; @@ -55,7 +55,7 @@ macro_rules! step_impl_unsigned { ($($t:ty)*) => ($( #[unstable(feature = "step_trait", reason = "likely to be replaced by finer-grained traits", - issue = "27741")] + issue = "42168")] impl Step for $t { #[inline] fn step(&self, by: &$t) -> Option<$t> { @@ -115,7 +115,7 @@ macro_rules! step_impl_signed { ($($t:ty)*) => ($( #[unstable(feature = "step_trait", reason = "likely to be replaced by finer-grained traits", - issue = "27741")] + issue = "42168")] impl Step for $t { #[inline] fn step(&self, by: &$t) -> Option<$t> { @@ -187,7 +187,7 @@ macro_rules! step_impl_no_between { ($($t:ty)*) => ($( #[unstable(feature = "step_trait", reason = "likely to be replaced by finer-grained traits", - issue = "27741")] + issue = "42168")] impl Step for $t { #[inline] fn step(&self, by: &$t) -> Option<$t> { From e860655a999ad921eb379d7f220c3e8ad1bcbb54 Mon Sep 17 00:00:00 2001 From: est31 Date: Tue, 23 May 2017 20:17:38 +0200 Subject: [PATCH 24/24] Remove some needless // gate-test- comments Also, add detection to treat such comments as tidy errors. We also remove the found_lib_feature code because it was just repeating the found_feature code. Originally it was intended to allow for gate-test lines for lib features, but apparently nobody missed it. --- .../proc-macro/feature-gate-proc_macro.rs | 3 +- .../compile-fail/feature-gate-global_asm.rs | 2 -- src/tools/tidy/src/features.rs | 29 ++++++++++--------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs b/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs index 7e32800e0f9b8..eeede4b8aa13c 100644 --- a/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs +++ b/src/test/compile-fail-fulldeps/proc-macro/feature-gate-proc_macro.rs @@ -9,7 +9,6 @@ // except according to those terms. // aux-build:attr_proc_macro.rs -// gate-test-proc_macro #![feature(use_extern_macros)] extern crate attr_proc_macro; @@ -21,4 +20,4 @@ struct Foo; fn main() { let _ = Foo; -} \ No newline at end of file +} diff --git a/src/test/compile-fail/feature-gate-global_asm.rs b/src/test/compile-fail/feature-gate-global_asm.rs index 0560abb6af498..77f61ba47b005 100644 --- a/src/test/compile-fail/feature-gate-global_asm.rs +++ b/src/test/compile-fail/feature-gate-global_asm.rs @@ -8,8 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// gate-test-global_asm - global_asm!(""); //~ ERROR `global_asm!` is not stable fn main() {} diff --git a/src/tools/tidy/src/features.rs b/src/tools/tidy/src/features.rs index ad0d2fa0b3635..791b8d77e0b90 100644 --- a/src/tools/tidy/src/features.rs +++ b/src/tools/tidy/src/features.rs @@ -70,7 +70,7 @@ pub fn check(path: &Path, bad: &mut bool) { } let filen_underscore = filename.replace("-","_").replace(".rs",""); - test_filen_gate(&filen_underscore, &mut features); + let filename_is_gate_test = test_filen_gate(&filen_underscore, &mut features); contents.truncate(0); t!(t!(File::open(&file), &file).read_to_string(&mut contents)); @@ -92,17 +92,20 @@ pub fn check(path: &Path, bad: &mut bool) { }, None => continue, }; - let found_feature = features.get_mut(feature_name) - .map(|v| { v.has_gate_test = true; () }) - .is_some(); - - let found_lib_feature = features.get_mut(feature_name) - .map(|v| { v.has_gate_test = true; () }) - .is_some(); - - if !(found_feature || found_lib_feature) { - err(&format!("gate-test test found referencing a nonexistent feature '{}'", - feature_name)); + match features.get_mut(feature_name) { + Some(f) => { + if filename_is_gate_test { + err(&format!("The file is already marked as gate test \ + through its name, no need for a \ + 'gate-test-{}' comment", + feature_name)); + } + f.has_gate_test = true; + } + None => { + err(&format!("gate-test test found referencing a nonexistent feature '{}'", + feature_name)); + } } } }); @@ -265,4 +268,4 @@ pub fn collect_lib_features(base_src_path: &Path, } }); lib_features -} \ No newline at end of file +}