about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2017-03-28 14:10:16 +0200
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2017-04-25 11:07:42 +0200
commitf4b1e2af6836bcf30a8be05ff6a44df6f61b19f2 (patch)
tree0fc07cb3b3d9a62212d8580a96f543d0f67852f4 /src
parent3a5567bad45fbde0962263f484ebc76f750920e4 (diff)
downloadrust-f4b1e2af6836bcf30a8be05ff6a44df6f61b19f2.tar.gz
rust-f4b1e2af6836bcf30a8be05ff6a44df6f61b19f2.zip
Improve E0178 suggestion placement
Diffstat (limited to 'src')
-rw-r--r--src/librustc_errors/emitter.rs9
-rw-r--r--src/librustc_typeck/diagnostics.rs2
-rw-r--r--src/libsyntax/parse/parser.rs9
-rw-r--r--src/test/ui/did_you_mean/E0178.rs (renamed from src/test/compile-fail/E0178.rs)8
-rw-r--r--src/test/ui/did_you_mean/E0178.stderr26
-rw-r--r--src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.rs (renamed from src/test/compile-fail/trait-object-reference-without-parens-suggestion.rs)7
-rw-r--r--src/test/ui/did_you_mean/trait-object-reference-without-parens-suggestion.stderr22
7 files changed, 60 insertions, 23 deletions
diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs
index 085424ef7e6..68e58e230f8 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 54637269bc0..0f42ee15ecf 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 e1fe8f1b2eb..55098d77472 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
index 6527465e0b7..8fb6c9815ce 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 00000000000..86f51a28a52
--- /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
index f9f887b78b0..11757abae9c 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 00000000000..cffa0474d22
--- /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
+