diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs index 085424ef7e67..68e58e230f82 100644 --- a/src/librustc_errors/emitter.rs +++ b/src/librustc_errors/emitter.rs @@ -37,9 +37,12 @@ impl Emitter for EmitterWriter { if let Some(sugg) = db.suggestion.clone() { assert_eq!(sugg.msp.primary_spans().len(), sugg.substitutes.len()); - if sugg.substitutes.len() == 1 && // don't display multispans as labels - sugg.msg.split_whitespace().count() < 10 && // don't display long messages as labels - sugg.substitutes[0].find('\n').is_none() { // don't display multiline suggestions as labels + // don't display multispans as labels + if sugg.substitutes.len() == 1 && + // don't display long messages as labels + sugg.msg.split_whitespace().count() < 10 && + // don't display multiline suggestions as labels + sugg.substitutes[0].find('\n').is_none() { let msg = format!("{} `{}`", sugg.msg, sugg.substitutes[0]); primary_span.push_span_label(sugg.msp.primary_spans()[0], msg); } else { diff --git a/src/librustc_typeck/diagnostics.rs b/src/librustc_typeck/diagnostics.rs index 54637269bc02..0f42ee15ecf6 100644 --- a/src/librustc_typeck/diagnostics.rs +++ b/src/librustc_typeck/diagnostics.rs @@ -3185,7 +3185,7 @@ implementing traits from `std::ops`. 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. If something should be added to a string literal, move the -literal to the heap by allocating it with `to_owned()` like in +literal to the heap by allocating it with `to_owned()` like in `"Your text".to_owned()`. "##, diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e1fe8f1b2eb3..55098d774723 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1490,9 +1490,8 @@ impl<'a> Parser<'a> { let bounds = self.parse_ty_param_bounds()?; let sum_span = ty.span.to(self.prev_span); - let mut err = struct_span_err!(self.sess.span_diagnostic, ty.span, E0178, + let mut err = struct_span_err!(self.sess.span_diagnostic, sum_span, E0178, "expected a path on the left-hand side of `+`, not `{}`", pprust::ty_to_string(&ty)); - err.span_label(ty.span, &format!("expected a path")); match ty.node { TyKind::Rptr(ref lifetime, ref mut_ty) => { @@ -1511,9 +1510,11 @@ impl<'a> Parser<'a> { err.span_suggestion(sum_span, "try adding parentheses:", sum_with_parens); } TyKind::Ptr(..) | TyKind::BareFn(..) => { - help!(&mut err, "perhaps you forgot parentheses?"); + err.span_label(sum_span, &"perhaps you forgot parentheses?"); } - _ => {} + _ => { + err.span_label(sum_span, &"expected a path"); + }, } err.emit(); Ok(()) diff --git a/src/test/compile-fail/E0178.rs b/src/test/ui/did_you_mean/E0178.rs similarity index 74% rename from src/test/compile-fail/E0178.rs rename to src/test/ui/did_you_mean/E0178.rs index 6527465e0b7f..8fb6c9815cef 100644 --- a/src/test/compile-fail/E0178.rs +++ b/src/test/ui/did_you_mean/E0178.rs @@ -12,17 +12,9 @@ trait Foo {} struct Bar<'a> { w: &'a Foo + Copy, - //~^ ERROR E0178 - //~| NOTE expected a path x: &'a Foo + 'a, - //~^ ERROR E0178 - //~| NOTE expected a path y: &'a mut Foo + 'a, - //~^ ERROR E0178 - //~| NOTE expected a path z: fn() -> Foo + 'a, - //~^ ERROR E0178 - //~| NOTE expected a path } fn main() { diff --git a/src/test/ui/did_you_mean/E0178.stderr b/src/test/ui/did_you_mean/E0178.stderr new file mode 100644 index 000000000000..86f51a28a52f --- /dev/null +++ b/src/test/ui/did_you_mean/E0178.stderr @@ -0,0 +1,26 @@ +error[E0178]: expected a path on the left-hand side of `+`, not `&'a Foo` + --> $DIR/E0178.rs:14:8 + | +14 | w: &'a Foo + Copy, + | ^^^^^^^^^^^^^^ try adding parentheses: `&'a (Foo + Copy)` + +error[E0178]: expected a path on the left-hand side of `+`, not `&'a Foo` + --> $DIR/E0178.rs:15:8 + | +15 | x: &'a Foo + 'a, + | ^^^^^^^^^^^^ try adding parentheses: `&'a (Foo + 'a)` + +error[E0178]: expected a path on the left-hand side of `+`, not `&'a mut Foo` + --> $DIR/E0178.rs:16:8 + | +16 | y: &'a mut Foo + 'a, + | ^^^^^^^^^^^^^^^^ try adding parentheses: `&'a mut (Foo + 'a)` + +error[E0178]: expected a path on the left-hand side of `+`, not `fn() -> Foo` + --> $DIR/E0178.rs:17:8 + | +17 | z: fn() -> Foo + 'a, + | ^^^^^^^^^^^^^^^^ perhaps you forgot parentheses? + +error: aborting due to 4 previous errors + diff --git a/src/test/compile-fail/trait-object-reference-without-parens-suggestion.rs b/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.rs similarity index 63% rename from src/test/compile-fail/trait-object-reference-without-parens-suggestion.rs rename to src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.rs index f9f887b78b0d..11757abae9c9 100644 --- a/src/test/compile-fail/trait-object-reference-without-parens-suggestion.rs +++ b/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.rs @@ -10,12 +10,5 @@ fn main() { let _: &Copy + 'static; - //~^ ERROR expected a path - //~| HELP try adding parentheses - //~| SUGGESTION let _: &(Copy + 'static); - //~| ERROR the trait `std::marker::Copy` cannot be made into an object let _: &'static Copy + 'static; - //~^ ERROR expected a path - //~| HELP try adding parentheses - //~| SUGGESTION let _: &'static (Copy + 'static); } diff --git a/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr b/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr new file mode 100644 index 000000000000..cffa0474d224 --- /dev/null +++ b/src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr @@ -0,0 +1,22 @@ +error[E0178]: expected a path on the left-hand side of `+`, not `&Copy` + --> $DIR/trait-object-reference-without-parens-suggestion.rs:12:12 + | +12 | let _: &Copy + 'static; + | ^^^^^^^^^^^^^^^ try adding parentheses: `&(Copy + 'static)` + +error[E0178]: expected a path on the left-hand side of `+`, not `&'static Copy` + --> $DIR/trait-object-reference-without-parens-suggestion.rs:13:12 + | +13 | let _: &'static Copy + 'static; + | ^^^^^^^^^^^^^^^^^^^^^^^ try adding parentheses: `&'static (Copy + 'static)` + +error[E0038]: the trait `std::marker::Copy` cannot be made into an object + --> $DIR/trait-object-reference-without-parens-suggestion.rs:12:12 + | +12 | let _: &Copy + 'static; + | ^^^^^ the trait `std::marker::Copy` cannot be made into an object + | + = note: the trait cannot require that `Self : Sized` + +error: aborting due to previous error +