about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-12-10 21:42:20 +0000
committerbors <bors@rust-lang.org>2018-12-10 21:42:20 +0000
commitda1527cb06c7245f83ca51903ea2a27631820215 (patch)
tree70ec3fd00841fe2fa1ea298bd5f399ca5a98f602 /src
parent1137d29d5e551e377579c5a601fe7c444057d00c (diff)
parenta11de4171c1712a0c42d05207f4f01fb49c40d0d (diff)
downloadrust-da1527cb06c7245f83ca51903ea2a27631820215.tar.gz
rust-da1527cb06c7245f83ca51903ea2a27631820215.zip
Auto merge of #56688 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 5 pull requests

Successful merges:

 - #56491 (emit error with span for empty asserts)
 - #56633 (Fix right arrow size for crate filter)
 - #56641 (fix span for invalid number of parameters in trait method)
 - #56656 (Fix typo)
 - #56661 (Add regression test for ICE)

Failed merges:

r? @ghost
Diffstat (limited to 'src')
-rw-r--r--src/liballoc/string.rs2
-rw-r--r--src/librustc_typeck/check/compare_method.rs26
-rw-r--r--src/librustdoc/html/static/rustdoc.css2
-rw-r--r--src/libsyntax_ext/assert.rs8
-rw-r--r--src/test/ui/error-codes/E0050.stderr8
-rw-r--r--src/test/ui/issue-55846.rs39
-rw-r--r--src/test/ui/macros/assert.rs4
-rw-r--r--src/test/ui/macros/assert.stderr16
-rw-r--r--src/test/ui/trait-method-number-parameters.rs23
-rw-r--r--src/test/ui/trait-method-number-parameters.stderr13
-rw-r--r--src/test/ui/traits/trait-impl-different-num-params.stderr2
11 files changed, 130 insertions, 13 deletions
diff --git a/src/liballoc/string.rs b/src/liballoc/string.rs
index 006c602649b..4652c0e7efa 100644
--- a/src/liballoc/string.rs
+++ b/src/liballoc/string.rs
@@ -2169,7 +2169,7 @@ impl<T: fmt::Display + ?Sized> ToString for T {
         use core::fmt::Write;
         let mut buf = String::new();
         buf.write_fmt(format_args!("{}", self))
-           .expect("a Display implementation return an error unexpectedly");
+           .expect("a Display implementation returned an error unexpectedly");
         buf.shrink_to_fit();
         buf
     }
diff --git a/src/librustc_typeck/check/compare_method.rs b/src/librustc_typeck/check/compare_method.rs
index a8291b5ddb1..984f1ca65ce 100644
--- a/src/librustc_typeck/check/compare_method.rs
+++ b/src/librustc_typeck/check/compare_method.rs
@@ -648,12 +648,19 @@ fn compare_number_of_method_arguments<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
         let trait_span = if let Some(trait_id) = trait_m_node_id {
             match tcx.hir().expect_trait_item(trait_id).node {
                 TraitItemKind::Method(ref trait_m_sig, _) => {
-                    if let Some(arg) = trait_m_sig.decl.inputs.get(if trait_number_args > 0 {
+                    let pos = if trait_number_args > 0 {
                         trait_number_args - 1
                     } else {
                         0
-                    }) {
-                        Some(arg.span)
+                    };
+                    if let Some(arg) = trait_m_sig.decl.inputs.get(pos) {
+                        Some(if pos == 0 {
+                            arg.span
+                        } else {
+                            Span::new(trait_m_sig.decl.inputs[0].span.lo(),
+                                      arg.span.hi(),
+                                      arg.span.ctxt())
+                        })
                     } else {
                         trait_item_span
                     }
@@ -666,12 +673,19 @@ fn compare_number_of_method_arguments<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
         let impl_m_node_id = tcx.hir().as_local_node_id(impl_m.def_id).unwrap();
         let impl_span = match tcx.hir().expect_impl_item(impl_m_node_id).node {
             ImplItemKind::Method(ref impl_m_sig, _) => {
-                if let Some(arg) = impl_m_sig.decl.inputs.get(if impl_number_args > 0 {
+                let pos = if impl_number_args > 0 {
                     impl_number_args - 1
                 } else {
                     0
-                }) {
-                    arg.span
+                };
+                if let Some(arg) = impl_m_sig.decl.inputs.get(pos) {
+                    if pos == 0 {
+                        arg.span
+                    } else {
+                        Span::new(impl_m_sig.decl.inputs[0].span.lo(),
+                                  arg.span.hi(),
+                                  arg.span.ctxt())
+                    }
                 } else {
                     impl_m_span
                 }
diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 37d26a4cadc..cd5a8a739d1 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -641,7 +641,7 @@ a {
 	text-overflow: "";
 	background-repeat: no-repeat;
 	background-color: transparent;
-	background-size: 16%;
+	background-size: 20px;
 	background-position: calc(100% - 1px) 56%;
 }
 .search-container > .top-button {
diff --git a/src/libsyntax_ext/assert.rs b/src/libsyntax_ext/assert.rs
index e3bd2ca0131..a2384b59048 100644
--- a/src/libsyntax_ext/assert.rs
+++ b/src/libsyntax_ext/assert.rs
@@ -24,6 +24,14 @@ pub fn expand_assert<'cx>(
     tts: &[TokenTree],
 ) -> Box<dyn MacResult + 'cx> {
     let mut parser = cx.new_parser_from_tts(tts);
+
+    if parser.token == token::Eof {
+        cx.struct_span_err(sp, "macro requires a boolean expression as an argument")
+            .span_label(sp, "boolean expression required")
+            .emit();
+        return DummyResult::expr(sp);
+    }
+
     let cond_expr = panictry!(parser.parse_expr());
     let custom_msg_args = if parser.eat(&token::Comma) {
         let ts = parser.parse_tokens();
diff --git a/src/test/ui/error-codes/E0050.stderr b/src/test/ui/error-codes/E0050.stderr
index bff3b7b16b9..6c797e00731 100644
--- a/src/test/ui/error-codes/E0050.stderr
+++ b/src/test/ui/error-codes/E0050.stderr
@@ -2,7 +2,7 @@ error[E0050]: method `foo` has 1 parameter but the declaration in trait `Foo::fo
   --> $DIR/E0050.rs:20:12
    |
 LL |     fn foo(&self, x: u8) -> bool;
-   |                      -- trait requires 2 parameters
+   |            ------------ trait requires 2 parameters
 ...
 LL |     fn foo(&self) -> bool { true } //~ ERROR E0050
    |            ^^^^^ expected 2 parameters, found 1
@@ -11,19 +11,19 @@ error[E0050]: method `bar` has 1 parameter but the declaration in trait `Foo::ba
   --> $DIR/E0050.rs:21:12
    |
 LL |     fn bar(&self, x: u8, y: u8, z: u8);
-   |                                    -- trait requires 4 parameters
+   |            -------------------------- trait requires 4 parameters
 ...
 LL |     fn bar(&self) { } //~ ERROR E0050
    |            ^^^^^ expected 4 parameters, found 1
 
 error[E0050]: method `less` has 4 parameters but the declaration in trait `Foo::less` has 1
-  --> $DIR/E0050.rs:22:37
+  --> $DIR/E0050.rs:22:13
    |
 LL |     fn less(&self);
    |             ----- trait requires 1 parameter
 ...
 LL |     fn less(&self, x: u8, y: u8, z: u8) { } //~ ERROR E0050
-   |                                     ^^ expected 1 parameter, found 4
+   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 parameter, found 4
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/issue-55846.rs b/src/test/ui/issue-55846.rs
new file mode 100644
index 00000000000..bd766752360
--- /dev/null
+++ b/src/test/ui/issue-55846.rs
@@ -0,0 +1,39 @@
+// run-pass
+
+// Regression test for #55846, which once caused an ICE.
+
+use std::marker::PhantomData;
+
+struct Foo;
+
+struct Bar<A> {
+    a: PhantomData<A>,
+}
+
+impl Fooifier for Foo {
+    type Assoc = Foo;
+}
+
+trait Fooifier {
+    type Assoc;
+}
+
+trait Barifier<H> {
+    fn barify();
+}
+
+impl<H> Barifier<H> for Bar<H> {
+    fn barify() {
+        println!("All correct!");
+    }
+}
+
+impl Bar<<Foo as Fooifier>::Assoc> {
+    fn this_shouldnt_crash() {
+        <Self as Barifier<<Foo as Fooifier>::Assoc>>::barify();
+    }
+}
+
+fn main() {
+    Bar::<Foo>::this_shouldnt_crash();
+}
diff --git a/src/test/ui/macros/assert.rs b/src/test/ui/macros/assert.rs
new file mode 100644
index 00000000000..8732cb58d74
--- /dev/null
+++ b/src/test/ui/macros/assert.rs
@@ -0,0 +1,4 @@
+fn main() {
+    assert!();  //~ ERROR requires a boolean expression
+    debug_assert!(); //~ ERROR requires a boolean expression
+}
diff --git a/src/test/ui/macros/assert.stderr b/src/test/ui/macros/assert.stderr
new file mode 100644
index 00000000000..89faba0cf63
--- /dev/null
+++ b/src/test/ui/macros/assert.stderr
@@ -0,0 +1,16 @@
+error: macro requires a boolean expression as an argument
+  --> $DIR/assert.rs:2:5
+   |
+LL |     assert!();  //~ ERROR requires a boolean expression
+   |     ^^^^^^^^^^ boolean expression required
+
+error: macro requires a boolean expression as an argument
+  --> $DIR/assert.rs:3:5
+   |
+LL |     debug_assert!(); //~ ERROR requires a boolean expression
+   |     ^^^^^^^^^^^^^^^^ boolean expression required
+   |
+   = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/trait-method-number-parameters.rs b/src/test/ui/trait-method-number-parameters.rs
new file mode 100644
index 00000000000..c2591e4bda6
--- /dev/null
+++ b/src/test/ui/trait-method-number-parameters.rs
@@ -0,0 +1,23 @@
+// Copyright 2018 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+trait Foo {
+    fn foo(&mut self, x: i32, y: i32) -> i32;
+}
+
+impl Foo for i32 {
+    fn foo(
+        &mut self, //~ ERROR
+        x: i32,
+    ) {
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/trait-method-number-parameters.stderr b/src/test/ui/trait-method-number-parameters.stderr
new file mode 100644
index 00000000000..98a08d2474d
--- /dev/null
+++ b/src/test/ui/trait-method-number-parameters.stderr
@@ -0,0 +1,13 @@
+error[E0050]: method `foo` has 2 parameters but the declaration in trait `Foo::foo` has 3
+  --> $DIR/trait-method-number-parameters.rs:17:9
+   |
+LL |       fn foo(&mut self, x: i32, y: i32) -> i32;
+   |              ------------------------- trait requires 3 parameters
+...
+LL | /         &mut self, //~ ERROR
+LL | |         x: i32,
+   | |______________^ expected 3 parameters, found 2
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0050`.
diff --git a/src/test/ui/traits/trait-impl-different-num-params.stderr b/src/test/ui/traits/trait-impl-different-num-params.stderr
index c3bbf99b06a..18024449d81 100644
--- a/src/test/ui/traits/trait-impl-different-num-params.stderr
+++ b/src/test/ui/traits/trait-impl-different-num-params.stderr
@@ -2,7 +2,7 @@ error[E0050]: method `bar` has 1 parameter but the declaration in trait `foo::ba
   --> $DIR/trait-impl-different-num-params.rs:15:12
    |
 LL |     fn bar(&self, x: usize) -> Self;
-   |                      ----- trait requires 2 parameters
+   |            --------------- trait requires 2 parameters
 ...
 LL |     fn bar(&self) -> isize {
    |            ^^^^^ expected 2 parameters, found 1