From 84096e05304794138098395a230028756f9f3b83 Mon Sep 17 00:00:00 2001 From: Unreachable Date: Fri, 5 Apr 2019 03:05:33 +0000 Subject: [PATCH 01/11] improve docs for std::hint::unreachable_unchecked() --- src/libcore/hint.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs index d43e6c49f4c99..cd4962d30df11 100644 --- a/src/libcore/hint.rs +++ b/src/libcore/hint.rs @@ -21,9 +21,8 @@ use intrinsics; /// difficult-to-debug problems. /// /// Use this function only when you can prove that the code will never call it. -/// -/// The [`unreachable!()`] macro is the safe counterpart of this function, which -/// will panic instead when executed. +/// Otherwise, consider using the [`unreachable!()`] macro, which does not allow +/// optimizations but will panic when executed. /// /// [`unreachable!()`]: ../macro.unreachable.html /// From 62a7bfd1ba299f451421306cb3705d697619359a Mon Sep 17 00:00:00 2001 From: Unreachable Date: Fri, 5 Apr 2019 17:42:09 +0000 Subject: [PATCH 02/11] Remove parens --- src/libcore/hint.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs index cd4962d30df11..89bf364096896 100644 --- a/src/libcore/hint.rs +++ b/src/libcore/hint.rs @@ -21,10 +21,10 @@ use intrinsics; /// difficult-to-debug problems. /// /// Use this function only when you can prove that the code will never call it. -/// Otherwise, consider using the [`unreachable!()`] macro, which does not allow +/// Otherwise, consider using the [`unreachable!`] macro, which does not allow /// optimizations but will panic when executed. /// -/// [`unreachable!()`]: ../macro.unreachable.html +/// [`unreachable!`]: ../macro.unreachable.html /// /// # Example /// From 13a05a27e9a5747cad090b1670c0a6b0baa624b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Thu, 11 Apr 2019 20:01:19 -0700 Subject: [PATCH 03/11] Continue evaluating after missing main --- src/librustc/middle/entry.rs | 1 - src/librustc_interface/passes.rs | 8 +++-- src/test/ui/continue-after-missing-main.rs | 32 +++++++++++++++++++ .../ui/continue-after-missing-main.stderr | 17 ++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/continue-after-missing-main.rs create mode 100644 src/test/ui/continue-after-missing-main.stderr diff --git a/src/librustc/middle/entry.rs b/src/librustc/middle/entry.rs index c20454a8822cd..df77033ebef3b 100644 --- a/src/librustc/middle/entry.rs +++ b/src/librustc/middle/entry.rs @@ -163,7 +163,6 @@ fn configure_main( err.span_note(span, "here is a function named 'main'"); } err.emit(); - tcx.sess.abort_if_errors(); } else { if let Some(ref filename) = tcx.sess.local_crate_source_file { err.note(&format!("consider adding a `main` function to `{}`", filename.display())); diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index 1547e15fd48c5..dc43d3c1aca2a 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -888,10 +888,11 @@ fn analysis<'tcx>( assert_eq!(cnum, LOCAL_CRATE); let sess = tcx.sess; + let mut entry_point = None; time(sess, "misc checking 1", || { parallel!({ - time(sess, "looking for entry point", || { + entry_point = time(sess, "looking for entry point", || { middle::entry::find_entry_point(tcx) }); @@ -939,7 +940,10 @@ fn analysis<'tcx>( // Abort so we don't try to construct MIR with liveness errors. // We also won't want to continue with errors from rvalue promotion - tcx.sess.abort_if_errors(); + // We only do so if the only error found so far *isn't* a missing `fn main()` + if !(entry_point.is_none() && sess.err_count() == 1) { + tcx.sess.abort_if_errors(); + } time(sess, "borrow checking", || { if tcx.use_ast_borrowck() { diff --git a/src/test/ui/continue-after-missing-main.rs b/src/test/ui/continue-after-missing-main.rs new file mode 100644 index 0000000000000..7455c2a431d62 --- /dev/null +++ b/src/test/ui/continue-after-missing-main.rs @@ -0,0 +1,32 @@ +#![allow(dead_code)] + +// error-pattern:`main` function not found in crate + +struct Tableau<'a, MP> { + provider: &'a MP, +} + +impl<'adapted_matrix_provider, 'original_data, MP> + Tableau<'adapted_matrix_provider, AdaptedMatrixProvider<'original_data, MP>> +{ + fn provider(&self) -> &'adapted_matrix_provider AdaptedMatrixProvider { + self.provider + } +} + +struct AdaptedMatrixProvider<'a, T> { + original_problem: &'a T, +} + +impl<'a, T> AdaptedMatrixProvider<'a, T> { + fn clone_with_extra_bound(&self) -> Self { + AdaptedMatrixProvider { original_problem: self.original_problem } + } +} + +fn create_and_solve_subproblems<'data_provider, 'original_data, MP>( + tableau: Tableau<'data_provider, AdaptedMatrixProvider<'original_data, MP>>, +) { + let _: AdaptedMatrixProvider<'original_data, MP> = tableau.provider().clone_with_extra_bound(); + //~^ ERROR lifetime mismatch +} diff --git a/src/test/ui/continue-after-missing-main.stderr b/src/test/ui/continue-after-missing-main.stderr new file mode 100644 index 0000000000000..8d64fee8bdaee --- /dev/null +++ b/src/test/ui/continue-after-missing-main.stderr @@ -0,0 +1,17 @@ +error[E0601]: `main` function not found in crate `continue_after_missing_main` + | + = note: consider adding a `main` function to `$DIR/continue-after-missing-main.rs` + +error[E0623]: lifetime mismatch + --> $DIR/continue-after-missing-main.rs:30:56 + | +LL | tableau: Tableau<'data_provider, AdaptedMatrixProvider<'original_data, MP>>, + | ------------------------------------------------------------------ these two types are declared with different lifetimes... +LL | ) { +LL | let _: AdaptedMatrixProvider<'original_data, MP> = tableau.provider().clone_with_extra_bound(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...but data from `tableau` flows into `tableau` here + +error: aborting due to 2 previous errors + +Some errors occurred: E0601, E0623. +For more information about an error, try `rustc --explain E0601`. From bc428b57a1274dd8b80a77b4f20d4a014aea1aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Sat, 6 Apr 2019 18:07:53 +0200 Subject: [PATCH 04/11] Limit dylib symbols --- src/librustc_codegen_ssa/back/linker.rs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/librustc_codegen_ssa/back/linker.rs b/src/librustc_codegen_ssa/back/linker.rs index c99fc17dd89a1..8884edbb24816 100644 --- a/src/librustc_codegen_ssa/back/linker.rs +++ b/src/librustc_codegen_ssa/back/linker.rs @@ -372,15 +372,11 @@ impl<'a> Linker for GccLinker<'a> { } fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType) { - // If we're compiling a dylib, then we let symbol visibility in object - // files to take care of whether they're exported or not. - // - // If we're compiling a cdylib, however, we manually create a list of - // exported symbols to ensure we don't expose any more. The object files - // have far more public symbols than we actually want to export, so we - // hide them all here. - if crate_type == CrateType::Dylib || - crate_type == CrateType::ProcMacro { + // We manually create a list of exported symbols to ensure we don't expose any more. + // The object files have far more public symbols than we actually want to export, + // so we hide them all here. + + if crate_type == CrateType::ProcMacro { return } From 40536548f998fb5830777304a756f839ec8b96de Mon Sep 17 00:00:00 2001 From: vlad-boroda Date: Sun, 14 Apr 2019 22:54:08 +0300 Subject: [PATCH 05/11] Fix rustdoc sidebar z-index --- src/librustdoc/html/static/rustdoc.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 2228e58b0d232..6dae600a6faba 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -166,6 +166,7 @@ nav.sub { top: 0; height: 100vh; overflow: auto; + z-index: 1; } .sidebar .block > ul > li { From 017479726e8ab023feb4a4d4cc7086bfc9e020ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Sun, 14 Apr 2019 19:05:21 +0200 Subject: [PATCH 06/11] Add a limit_rdylib_exports option and disable it for Solaris --- src/librustc_codegen_ssa/back/linker.rs | 11 ++++------- src/librustc_target/spec/mod.rs | 6 ++++++ src/librustc_target/spec/solaris_base.rs | 1 + src/librustc_target/spec/wasm32_base.rs | 5 +++++ .../spec/wasm32_experimental_emscripten.rs | 1 + src/librustc_target/spec/wasm32_unknown_emscripten.rs | 1 + 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/librustc_codegen_ssa/back/linker.rs b/src/librustc_codegen_ssa/back/linker.rs index 8884edbb24816..b433856d5e130 100644 --- a/src/librustc_codegen_ssa/back/linker.rs +++ b/src/librustc_codegen_ssa/back/linker.rs @@ -376,15 +376,12 @@ impl<'a> Linker for GccLinker<'a> { // The object files have far more public symbols than we actually want to export, // so we hide them all here. - if crate_type == CrateType::ProcMacro { - return + if !self.sess.target.target.options.limit_rdylib_exports { + return; } - // Symbol visibility takes care of this for the WebAssembly. - // Additionally the only known linker, LLD, doesn't support the script - // arguments just yet - if self.sess.target.target.arch == "wasm32" { - return; + if crate_type == CrateType::ProcMacro { + return } let mut arg = OsString::new(); diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs index 46fefd78f4519..64799324f6a55 100644 --- a/src/librustc_target/spec/mod.rs +++ b/src/librustc_target/spec/mod.rs @@ -751,6 +751,9 @@ pub struct TargetOptions { /// wasm32 where the whole program either has simd or not. pub simd_types_indirect: bool, + /// Pass a list of symbol which should be exported in the dylib to the linker. + pub limit_rdylib_exports: bool, + /// If set, have the linker export exactly these symbols, instead of using /// the usual logic to figure this out from the crate itself. pub override_export_symbols: Option>, @@ -846,6 +849,7 @@ impl Default for TargetOptions { emit_debug_gdb_scripts: true, requires_uwtable: false, simd_types_indirect: true, + limit_rdylib_exports: true, override_export_symbols: None, merge_functions: MergeFunctions::Aliases, target_mcount: "mcount".to_string(), @@ -1152,6 +1156,7 @@ impl Target { key!(emit_debug_gdb_scripts, bool); key!(requires_uwtable, bool); key!(simd_types_indirect, bool); + key!(limit_rdylib_exports, bool); key!(override_export_symbols, opt_list); key!(merge_functions, MergeFunctions)?; key!(target_mcount); @@ -1367,6 +1372,7 @@ impl ToJson for Target { target_option_val!(emit_debug_gdb_scripts); target_option_val!(requires_uwtable); target_option_val!(simd_types_indirect); + target_option_val!(limit_rdylib_exports); target_option_val!(override_export_symbols); target_option_val!(merge_functions); target_option_val!(target_mcount); diff --git a/src/librustc_target/spec/solaris_base.rs b/src/librustc_target/spec/solaris_base.rs index 0dfbb13b77317..9e7eda037732b 100644 --- a/src/librustc_target/spec/solaris_base.rs +++ b/src/librustc_target/spec/solaris_base.rs @@ -8,6 +8,7 @@ pub fn opts() -> TargetOptions { has_rpath: true, target_family: Some("unix".to_string()), is_like_solaris: true, + limit_rdylib_exports: false, // Linker doesn't support this .. Default::default() } diff --git a/src/librustc_target/spec/wasm32_base.rs b/src/librustc_target/spec/wasm32_base.rs index edaf902c130d8..39a8ce9282573 100644 --- a/src/librustc_target/spec/wasm32_base.rs +++ b/src/librustc_target/spec/wasm32_base.rs @@ -106,6 +106,11 @@ pub fn options() -> TargetOptions { // no dynamic linking, no need for default visibility! default_hidden_visibility: true, + // Symbol visibility takes care of this for the WebAssembly. + // Additionally the only known linker, LLD, doesn't support the script + // arguments just yet + limit_rdylib_exports: false, + // we use the LLD shipped with the Rust toolchain by default linker: Some("rust-lld".to_owned()), lld_flavor: LldFlavor::Wasm, diff --git a/src/librustc_target/spec/wasm32_experimental_emscripten.rs b/src/librustc_target/spec/wasm32_experimental_emscripten.rs index 5ecd66306d055..b802bee25ae7a 100644 --- a/src/librustc_target/spec/wasm32_experimental_emscripten.rs +++ b/src/librustc_target/spec/wasm32_experimental_emscripten.rs @@ -24,6 +24,7 @@ pub fn target() -> Result { is_like_emscripten: true, max_atomic_width: Some(32), post_link_args, + limit_rdylib_exports: false, target_family: Some("unix".to_string()), .. Default::default() }; diff --git a/src/librustc_target/spec/wasm32_unknown_emscripten.rs b/src/librustc_target/spec/wasm32_unknown_emscripten.rs index a6e9340ce28ef..e0df36884bf56 100644 --- a/src/librustc_target/spec/wasm32_unknown_emscripten.rs +++ b/src/librustc_target/spec/wasm32_unknown_emscripten.rs @@ -26,6 +26,7 @@ pub fn target() -> Result { is_like_emscripten: true, max_atomic_width: Some(32), post_link_args, + limit_rdylib_exports: false, target_family: Some("unix".to_string()), codegen_backend: "emscripten".to_string(), .. Default::default() From 1c0e1c10d5c6463147690aba7696a7cbcf2840a1 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 15 Apr 2019 11:20:08 -0500 Subject: [PATCH 07/11] use --static-root-path for settings.js --- src/librustdoc/html/render.rs | 3 ++- src/test/rustdoc/static-root-path.rs | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 3ee131d8f5c8c..d91b78c8416b8 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -2113,7 +2113,8 @@ impl Context { &final_file); // Generating settings page. - let settings = Settings::new("./", &self.shared.resource_suffix); + let settings = Settings::new(self.shared.static_root_path.deref().unwrap_or("./"), + &self.shared.resource_suffix); page.title = "Rustdoc settings"; page.description = "Settings of Rustdoc"; page.root_path = "./"; diff --git a/src/test/rustdoc/static-root-path.rs b/src/test/rustdoc/static-root-path.rs index 84b32f90c89a4..2f7c89c5f1e6b 100644 --- a/src/test/rustdoc/static-root-path.rs +++ b/src/test/rustdoc/static-root-path.rs @@ -12,3 +12,7 @@ pub struct SomeStruct; // @!matches - '"\.\./\.\./source-script\.js"' // @matches - '"\.\./\.\./source-files.js"' // @!matches - '"/cache/source-files\.js"' + +// @has settings.html +// @matches - '/cache/settings\.js' +// @!matches - '\./settings\.js' From 74560f3ab36bb4f7f3aef3c66a3e9717f9ee1978 Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Mon, 15 Apr 2019 13:09:37 -0400 Subject: [PATCH 08/11] include mode in unused binding suggestion span --- src/librustc/middle/liveness.rs | 17 +++++--- .../lint/issue-54180-unused-ref-field.fixed | 34 ++++++++++++++++ .../ui/lint/issue-54180-unused-ref-field.rs | 34 ++++++++++++++++ .../lint/issue-54180-unused-ref-field.stderr | 39 +++++++++++++++++++ 4 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 src/test/ui/lint/issue-54180-unused-ref-field.fixed create mode 100644 src/test/ui/lint/issue-54180-unused-ref-field.rs create mode 100644 src/test/ui/lint/issue-54180-unused-ref-field.stderr diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index f5a95d7004bff..2fbe79ec8ebc5 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -1627,11 +1627,18 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { ); if self.ir.variable_is_shorthand(var) { - err.multipart_suggestion( - "try ignoring the field", - spans.iter().map(|span| (*span, format!("{}: _", name))).collect(), - Applicability::MachineApplicable - ); + if let Node::Binding(pat) = self.ir.tcx.hir().get_by_hir_id(hir_id) { + // Handle `ref` and `ref mut`. + let spans = spans.iter() + .map(|_span| (pat.span, format!("{}: _", name))) + .collect(); + + err.multipart_suggestion( + "try ignoring the field", + spans, + Applicability::MachineApplicable, + ); + } } else { err.multipart_suggestion( "consider prefixing with an underscore", diff --git a/src/test/ui/lint/issue-54180-unused-ref-field.fixed b/src/test/ui/lint/issue-54180-unused-ref-field.fixed new file mode 100644 index 0000000000000..1350b7ca6996c --- /dev/null +++ b/src/test/ui/lint/issue-54180-unused-ref-field.fixed @@ -0,0 +1,34 @@ +// run-rustfix + +#![deny(unused)] + +pub struct S { + pub f1: i32, +} + +pub struct Point { + pub x: i32, + pub y: i32, +} + +pub enum E { + Variant { field: String } +} + +pub fn foo(arg: &E) { + match arg { + E::Variant { field: _ } => (), //~ ERROR unused variable + } +} + +fn main() { + let s = S { f1: 123 }; + let S { f1: _ } = s; //~ ERROR unused variable + + let points = vec![Point { x: 1, y: 2 }]; + let _: i32 = points.iter().map(|Point { x: _, y }| y).sum(); //~ ERROR unused variable + + match (Point { x: 1, y: 2 }) { + Point { y, x: _ } => y, //~ ERROR unused variable + }; +} diff --git a/src/test/ui/lint/issue-54180-unused-ref-field.rs b/src/test/ui/lint/issue-54180-unused-ref-field.rs new file mode 100644 index 0000000000000..7b3392b609a0a --- /dev/null +++ b/src/test/ui/lint/issue-54180-unused-ref-field.rs @@ -0,0 +1,34 @@ +// run-rustfix + +#![deny(unused)] + +pub struct S { + pub f1: i32, +} + +pub struct Point { + pub x: i32, + pub y: i32, +} + +pub enum E { + Variant { field: String } +} + +pub fn foo(arg: &E) { + match arg { + E::Variant { ref field } => (), //~ ERROR unused variable + } +} + +fn main() { + let s = S { f1: 123 }; + let S { ref f1 } = s; //~ ERROR unused variable + + let points = vec![Point { x: 1, y: 2 }]; + let _: i32 = points.iter().map(|Point { x, y }| y).sum(); //~ ERROR unused variable + + match (Point { x: 1, y: 2 }) { + Point { y, ref mut x } => y, //~ ERROR unused variable + }; +} diff --git a/src/test/ui/lint/issue-54180-unused-ref-field.stderr b/src/test/ui/lint/issue-54180-unused-ref-field.stderr new file mode 100644 index 0000000000000..9f47554a1a65e --- /dev/null +++ b/src/test/ui/lint/issue-54180-unused-ref-field.stderr @@ -0,0 +1,39 @@ +error: unused variable: `field` + --> $DIR/issue-54180-unused-ref-field.rs:20:26 + | +LL | E::Variant { ref field } => (), + | ----^^^^^ + | | + | help: try ignoring the field: `field: _` + | +note: lint level defined here + --> $DIR/issue-54180-unused-ref-field.rs:3:9 + | +LL | #![deny(unused)] + | ^^^^^^ + = note: #[deny(unused_variables)] implied by #[deny(unused)] + +error: unused variable: `x` + --> $DIR/issue-54180-unused-ref-field.rs:29:45 + | +LL | let _: i32 = points.iter().map(|Point { x, y }| y).sum(); + | ^ help: try ignoring the field: `x: _` + +error: unused variable: `f1` + --> $DIR/issue-54180-unused-ref-field.rs:26:17 + | +LL | let S { ref f1 } = s; + | ----^^ + | | + | help: try ignoring the field: `f1: _` + +error: unused variable: `x` + --> $DIR/issue-54180-unused-ref-field.rs:32:28 + | +LL | Point { y, ref mut x } => y, + | --------^ + | | + | help: try ignoring the field: `x: _` + +error: aborting due to 4 previous errors + From 9e171937b64f513f7848593257364cd8495399d5 Mon Sep 17 00:00:00 2001 From: vlad-boroda Date: Mon, 15 Apr 2019 20:18:53 +0300 Subject: [PATCH 09/11] change word wrapping mode --- 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 6dae600a6faba..8cf70b9a99502 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -346,7 +346,7 @@ nav.sub { margin: 0; } .docblock-short code { - white-space: nowrap; + white-space: pre-wrap; } .docblock h1, .docblock h2, .docblock h3, .docblock h4, .docblock h5 { From 4eb3ac3ce6c6ab591dfa6dd4f26eb8333c9b4a63 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Mon, 15 Apr 2019 12:47:33 -0700 Subject: [PATCH 10/11] Update cargo --- src/tools/cargo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/cargo b/src/tools/cargo index 6f3e9c367abb4..ef0223f12597b 160000 --- a/src/tools/cargo +++ b/src/tools/cargo @@ -1 +1 @@ -Subproject commit 6f3e9c367abb497c64f360c3839dab5e74928d5c +Subproject commit ef0223f12597b5e0d9d2feed1b92c41306b1fc05 From 3db489bdcfcf2c31034194a30ca60a7cc2ba5adb Mon Sep 17 00:00:00 2001 From: Pietro Albini Date: Mon, 15 Apr 2019 23:52:59 +0200 Subject: [PATCH 11/11] add repo-specific triagebot configuration --- triagebot.toml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 triagebot.toml diff --git a/triagebot.toml b/triagebot.toml new file mode 100644 index 0000000000000..6f60481600c2e --- /dev/null +++ b/triagebot.toml @@ -0,0 +1,6 @@ +[relabel] +allow-unauthenticated = [ + "C-*", "A-*", "E-*", "NLL-*", "O-*", "S-*", "T-*", "WG-*", + # I-* without I-nominated + "I-compilemem", "I-compiletime", "I-crash", "I-hang", "I-ICE", "I-slow", +]