diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index cedc2871623..7f331418d42 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -76,9 +76,13 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for WhileTrue { if let hir::ExprLit(ref lit) = cond.node { if let ast::LitKind::Bool(true) = lit.node { if lit.span.ctxt() == SyntaxContext::empty() { - cx.span_lint(WHILE_TRUE, - e.span, - "denote infinite loops with loop { ... }"); + let msg = "denote infinite loops with `loop { ... }`"; + let mut err = cx.struct_span_lint(WHILE_TRUE, e.span, msg); + let condition_span = cx.tcx.sess.codemap().def_span(e.span); + err.span_suggestion_short(condition_span, + "use `loop`", + "loop".to_owned()); + err.emit(); } } } diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index c51d5d3f1e7..887245b15d3 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -71,9 +71,13 @@ impl UnusedMut { let used_mutables = cx.tcx.used_mut_nodes.borrow(); for (_, v) in &mutables { if !v.iter().any(|e| used_mutables.contains(e)) { - cx.span_lint(UNUSED_MUT, - cx.tcx.hir.span(v[0]), - "variable does not need to be mutable"); + let binding_span = cx.tcx.hir.span(v[0]); + let mut_span = cx.tcx.sess.codemap().span_until_char(binding_span, ' '); + let mut err = cx.struct_span_lint(UNUSED_MUT, + binding_span, + "variable does not need to be mutable"); + err.span_suggestion_short(mut_span, "remove this `mut`", "".to_owned()); + err.emit(); } } } diff --git a/src/test/compile-fail/issue-1962.rs b/src/test/compile-fail/issue-1962.rs index db3e9c23b76..9de3040bb61 100644 --- a/src/test/compile-fail/issue-1962.rs +++ b/src/test/compile-fail/issue-1962.rs @@ -11,7 +11,7 @@ // compile-flags: -D while-true fn main() { let mut i = 0; - while true { //~ ERROR denote infinite loops with loop + while true { //~ ERROR denote infinite loops with `loop i += 1; if i == 5 { break; } } diff --git a/src/test/ui/lint/suggestions.rs b/src/test/ui/lint/suggestions.rs new file mode 100644 index 00000000000..874124a7d36 --- /dev/null +++ b/src/test/ui/lint/suggestions.rs @@ -0,0 +1,20 @@ +// 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. + +#![warn(unused_mut)] // UI tests pass `-A unused`—see Issue #43896 +#![feature(no_debug)] + +#[no_debug] // should suggest removal of deprecated attribute +fn main() { + while true { // should suggest `loop` + let mut a = (1); // should suggest no `mut`, no parens + println!("{}", a); + } +} diff --git a/src/test/ui/lint/suggestions.stderr b/src/test/ui/lint/suggestions.stderr new file mode 100644 index 00000000000..5b2a4f589f7 --- /dev/null +++ b/src/test/ui/lint/suggestions.stderr @@ -0,0 +1,45 @@ +warning: unnecessary parentheses around assigned value + --> $DIR/suggestions.rs:17:21 + | +17 | let mut a = (1); // should suggest no `mut`, no parens + | ^^^ help: remove these parentheses + | + = note: #[warn(unused_parens)] on by default + +warning: use of deprecated attribute `no_debug`: the `#[no_debug]` attribute was an experimental feature that has been deprecated due to lack of demand. See https://github.com/rust-lang/rust/issues/29721 + --> $DIR/suggestions.rs:14:1 + | +14 | #[no_debug] // should suggest removal of deprecated attribute + | ^^^^^^^^^^^ help: remove this attribute + | + = note: #[warn(deprecated)] on by default + +warning: denote infinite loops with `loop { ... }` + --> $DIR/suggestions.rs:16:5 + | +16 | while true { // should suggest `loop` + | ^--------- + | | + | _____help: use `loop` + | | +17 | | let mut a = (1); // should suggest no `mut`, no parens +18 | | println!("{}", a); +19 | | } + | |_____^ + | + = note: #[warn(while_true)] on by default + +warning: variable does not need to be mutable + --> $DIR/suggestions.rs:17:13 + | +17 | let mut a = (1); // should suggest no `mut`, no parens + | ---^^ + | | + | help: remove this `mut` + | +note: lint level defined here + --> $DIR/suggestions.rs:11:9 + | +11 | #![warn(unused_mut)] // UI tests pass `-A unused`—see Issue #43896 + | ^^^^^^^^^^ + diff --git a/src/test/ui/path-lookahead.stderr b/src/test/ui/path-lookahead.stderr index 1d4ab35046b..19e22b3f6f9 100644 --- a/src/test/ui/path-lookahead.stderr +++ b/src/test/ui/path-lookahead.stderr @@ -2,7 +2,7 @@ warning: unnecessary parentheses around `return` value --> $DIR/path-lookahead.rs:18:10 | 18 | return (::to_string(&arg)); //~WARN unnecessary parentheses around `return` value - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses | = note: #[warn(unused_parens)] on by default