diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs index 085424ef7e676..68e58e230f826 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 54637269bc02c..0f42ee15ecf6f 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 e1fe8f1b2eb3f..55098d7747234 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 6527465e0b7f7..8fb6c9815cef8 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 0000000000000..86f51a28a52ff --- /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 f9f887b78b0d8..11757abae9c97 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 0000000000000..cffa0474d2246 --- /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 +