From a367cec6e355a0b17d611acba5577ee72c228971 Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Mon, 3 Dec 2018 20:45:25 -0500 Subject: [PATCH 1/5] emit error with span for empty asserts Fixes #55547. --- src/libsyntax_ext/assert.rs | 8 ++++++++ src/test/ui/macros/assert.rs | 4 ++++ src/test/ui/macros/assert.stderr | 16 ++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 src/test/ui/macros/assert.rs create mode 100644 src/test/ui/macros/assert.stderr diff --git a/src/libsyntax_ext/assert.rs b/src/libsyntax_ext/assert.rs index e3bd2ca01310b..a2384b59048d5 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 { 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/macros/assert.rs b/src/test/ui/macros/assert.rs new file mode 100644 index 0000000000000..8732cb58d74a6 --- /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 0000000000000..89faba0cf63dd --- /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 + From bbc26548306b593573b867af897d7aa98cd061ef Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 8 Dec 2018 16:35:51 +0100 Subject: [PATCH 2/5] Fix right arrow size for crate filter --- src/librustdoc/html/static/rustdoc.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 37d26a4cadc57..cd5a8a739d16d 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 { From 05cea31c8dea7e5c4c8721e66b72588cbeb4b949 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 8 Dec 2018 20:04:14 +0100 Subject: [PATCH 3/5] fix span for invalid number of parameters in trait method --- src/librustc_typeck/check/compare_method.rs | 26 ++++++++++++++----- src/test/ui/error-codes/E0050.stderr | 8 +++--- src/test/ui/trait-method-number-parameters.rs | 23 ++++++++++++++++ .../ui/trait-method-number-parameters.stderr | 13 ++++++++++ .../trait-impl-different-num-params.stderr | 2 +- 5 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 src/test/ui/trait-method-number-parameters.rs create mode 100644 src/test/ui/trait-method-number-parameters.stderr diff --git a/src/librustc_typeck/check/compare_method.rs b/src/librustc_typeck/check/compare_method.rs index e30ebe07e5418..7c311db17d33a 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/test/ui/error-codes/E0050.stderr b/src/test/ui/error-codes/E0050.stderr index bff3b7b16b911..6c797e0073144 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/trait-method-number-parameters.rs b/src/test/ui/trait-method-number-parameters.rs new file mode 100644 index 0000000000000..c2591e4bda6be --- /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 or the MIT license +// , 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 0000000000000..98a08d2474d8f --- /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 c3bbf99b06a7e..18024449d81ee 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 From 6f288ea33712b34c8eabcd57bb10607ab01f0cdb Mon Sep 17 00:00:00 2001 From: BeatButton Date: Sun, 9 Dec 2018 14:10:20 -0700 Subject: [PATCH 4/5] Fix typo --- src/liballoc/string.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/liballoc/string.rs b/src/liballoc/string.rs index 006c602649b74..4652c0e7efa70 100644 --- a/src/liballoc/string.rs +++ b/src/liballoc/string.rs @@ -2169,7 +2169,7 @@ impl 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 } From 90b8131abc4eed3596b63e44a56c95258f0b4dc9 Mon Sep 17 00:00:00 2001 From: Felix Chapman Date: Mon, 10 Dec 2018 02:49:19 +0000 Subject: [PATCH 5/5] Add regression test for issue #55846 --- src/test/ui/issue-55846.rs | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/test/ui/issue-55846.rs diff --git a/src/test/ui/issue-55846.rs b/src/test/ui/issue-55846.rs new file mode 100644 index 0000000000000..bd766752360a1 --- /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: PhantomData, +} + +impl Fooifier for Foo { + type Assoc = Foo; +} + +trait Fooifier { + type Assoc; +} + +trait Barifier { + fn barify(); +} + +impl Barifier for Bar { + fn barify() { + println!("All correct!"); + } +} + +impl Bar<::Assoc> { + fn this_shouldnt_crash() { + ::Assoc>>::barify(); + } +} + +fn main() { + Bar::::this_shouldnt_crash(); +}