From 9158e17997db0a21a27774a66b944539f4ef441a Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Sun, 15 Dec 2019 09:42:09 +0100 Subject: [PATCH 01/10] Document more use cases of dataflow --- src/librustc_mir/dataflow/mod.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs index ad0f75d772548..af16adf9eb32f 100644 --- a/src/librustc_mir/dataflow/mod.rs +++ b/src/librustc_mir/dataflow/mod.rs @@ -650,6 +650,20 @@ pub trait BottomValue { const BOTTOM_VALUE: bool; /// Merges `in_set` into `inout_set`, returning `true` if `inout_set` changed. + /// + /// You usually don't need to override this, since it automatically applies + /// * `inout_set & in_set` if `BOTTOM_VALUE == true` + /// * `inout_set | in_set` if `BOTTOM_VALUE == false` + /// + /// This means that if a bit is not `BOTTOM_VALUE`, it is propagated into all target blocks. + /// For clarity, the above statement again from a different perspective: + /// A block's initial bit value is `!BOTTOM_VALUE` if *any* predecessor block's bit value is + /// `!BOTTOM_VALUE`. + /// There are situations where you want the opposite behaviour: propagate only if *all* + /// predecessor blocks's value is `!BOTTOM_VALUE`. In that case you need to + /// 1. Invert `BOTTOM_VALUE` + /// 2. Reset the `entry_set` in `start_block_effect` to `!BOTTOM_VALUE` + /// 3. Override `join` to do the opposite from what it's doing now. #[inline] fn join(&self, inout_set: &mut BitSet, in_set: &BitSet) -> bool { if Self::BOTTOM_VALUE == false { @@ -667,7 +681,9 @@ pub trait BottomValue { /// for each block individually. The entry set for all other basic blocks is /// initialized to `Self::BOTTOM_VALUE`. The dataflow analysis then /// iteratively modifies the various entry sets (but leaves the the transfer -/// function unchanged). +/// function unchanged). `BottomValue::join` is used to merge the bitsets from +/// two blocks (e.g. when two blocks' terminator jumps to a single block, that +/// target block's state is the merged state of both incoming blocks). pub trait BitDenotation<'tcx>: BottomValue { /// Specifies what index type is used to access the bitvector. type Idx: Idx; From 5f08df104742ce400e966f6cd80c9029f0328922 Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Fri, 20 Dec 2019 19:46:38 +0100 Subject: [PATCH 02/10] Address review comments --- src/librustc_mir/dataflow/mod.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/librustc_mir/dataflow/mod.rs b/src/librustc_mir/dataflow/mod.rs index af16adf9eb32f..3f810472c6465 100644 --- a/src/librustc_mir/dataflow/mod.rs +++ b/src/librustc_mir/dataflow/mod.rs @@ -651,16 +651,22 @@ pub trait BottomValue { /// Merges `in_set` into `inout_set`, returning `true` if `inout_set` changed. /// - /// You usually don't need to override this, since it automatically applies + /// It is almost certainly wrong to override this, since it automatically applies /// * `inout_set & in_set` if `BOTTOM_VALUE == true` /// * `inout_set | in_set` if `BOTTOM_VALUE == false` /// /// This means that if a bit is not `BOTTOM_VALUE`, it is propagated into all target blocks. /// For clarity, the above statement again from a different perspective: - /// A block's initial bit value is `!BOTTOM_VALUE` if *any* predecessor block's bit value is + /// A bit in the block's entry set is `!BOTTOM_VALUE` if *any* predecessor block's bit value is /// `!BOTTOM_VALUE`. + /// /// There are situations where you want the opposite behaviour: propagate only if *all* - /// predecessor blocks's value is `!BOTTOM_VALUE`. In that case you need to + /// predecessor blocks's value is `!BOTTOM_VALUE`. + /// E.g. if you want to know whether a bit is *definitely* set at a specific location. This + /// means that all code paths leading to the location must have set the bit, instead of any + /// code path leading there. + /// + /// If you want this kind of "definitely set" analysis, you need to /// 1. Invert `BOTTOM_VALUE` /// 2. Reset the `entry_set` in `start_block_effect` to `!BOTTOM_VALUE` /// 3. Override `join` to do the opposite from what it's doing now. From 1ffb9cf8d75e6f8b9aa27a25c7bc56c7bb3a1c43 Mon Sep 17 00:00:00 2001 From: Liigo Zhuang Date: Tue, 7 Jan 2020 10:25:02 +0800 Subject: [PATCH 03/10] rustdoc: improve stability mark arrows --- src/librustdoc/html/static/rustdoc.css | 9 +++++---- src/librustdoc/html/static/themes/dark.css | 2 ++ src/librustdoc/html/static/themes/light.css | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 62fe23029d92f..870a99f362a73 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -542,11 +542,12 @@ h4 > code, h3 > code, .invisible > code { } .content .stability::before { - content: '˪'; - font-size: 30px; + content: '⤶'; + transform:rotate(90deg); + font-size: 25px; position: absolute; - top: -9px; - left: -13px; + top: -6px; + left: -17px; } .content .impl-items .method, .content .impl-items > .type, .impl-items > .associatedconstant { diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css index f46bd6d6a1005..9a0e7bbabcba9 100644 --- a/src/librustdoc/html/static/themes/dark.css +++ b/src/librustdoc/html/static/themes/dark.css @@ -105,6 +105,8 @@ pre { .content .highlighted.primitive { background-color: #00708a; } .content .highlighted.keyword { background-color: #884719; } +.content .stability::before { color: #ccc; } + .content span.enum, .content a.enum, .block a.current.enum { color: #82b089; } .content span.struct, .content a.struct, .block a.current.struct { color: #2dbfb8; } .content span.type, .content a.type, .block a.current.type { color: #ff7f00; } diff --git a/src/librustdoc/html/static/themes/light.css b/src/librustdoc/html/static/themes/light.css index ca67b1c1f8241..ca8ea1c456a2c 100644 --- a/src/librustdoc/html/static/themes/light.css +++ b/src/librustdoc/html/static/themes/light.css @@ -105,6 +105,8 @@ pre { .content .highlighted.primitive { background-color: #9aecff; } .content .highlighted.keyword { background-color: #f99650; } +.content .stability::before { color: #ccc; } + .content span.enum, .content a.enum, .block a.current.enum { color: #508157; } .content span.struct, .content a.struct, .block a.current.struct { color: #ad448e; } .content span.type, .content a.type, .block a.current.type { color: #ba5d00; } From ae3a53ff58cec7aca1dfd17479fca44b7f91491f Mon Sep 17 00:00:00 2001 From: Liigo Zhuang Date: Thu, 9 Jan 2020 09:54:05 +0800 Subject: [PATCH 04/10] rustdoc: use another stability mark arrow, no rotate. --- src/librustdoc/html/static/rustdoc.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 870a99f362a73..a91fdb7a10e0d 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -542,12 +542,11 @@ h4 > code, h3 > code, .invisible > code { } .content .stability::before { - content: '⤶'; - transform:rotate(90deg); + content: '⬑'; font-size: 25px; position: absolute; top: -6px; - left: -17px; + left: -19px; } .content .impl-items .method, .content .impl-items > .type, .impl-items > .associatedconstant { From 91e9531ed1a70eab0c4f6a6bce304e2a731f54e7 Mon Sep 17 00:00:00 2001 From: Mikail Bagishov Date: Fri, 10 Jan 2020 19:26:40 +0300 Subject: [PATCH 05/10] Clarify test timeout evironment variables --- src/libtest/cli.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libtest/cli.rs b/src/libtest/cli.rs index ea6d632f48a59..edff8bea0f3d0 100644 --- a/src/libtest/cli.rs +++ b/src/libtest/cli.rs @@ -125,6 +125,8 @@ fn optgroups() -> getopts::Options { `RUST_TEST_TIME_DOCTEST` environment variables. Expected format of environment variable is `VARIABLE=WARN_TIME,CRITICAL_TIME`. + Durations must be specified in milliseconds, e.g. `500,2000` means that the warn time + is 0.5 seconds, and the critical time is 2 seconds. Not available for --format=terse", "plain|colored", From ed039e8f8443a84dddfda8be7379ca7b4aaeccd9 Mon Sep 17 00:00:00 2001 From: Caleb Cartwright Date: Sat, 11 Jan 2020 13:19:57 -0600 Subject: [PATCH 06/10] restore some rustc_parse visibilities --- src/librustc_parse/parser/mod.rs | 13 +++++++++---- src/librustc_parse/parser/module.rs | 12 ++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/librustc_parse/parser/mod.rs b/src/librustc_parse/parser/mod.rs index a1035d320b31c..1368230168e07 100644 --- a/src/librustc_parse/parser/mod.rs +++ b/src/librustc_parse/parser/mod.rs @@ -2,6 +2,7 @@ pub mod attr; mod expr; mod item; mod module; +pub use module::{ModulePath, ModulePathSuccess}; mod pat; mod path; mod ty; @@ -117,7 +118,8 @@ pub struct Parser<'a> { /// Used to determine the path to externally loaded source files. pub(super) directory: Directory<'a>, /// `true` to parse sub-modules in other files. - pub(super) recurse_into_file_modules: bool, + // Public for rustfmt usage. + pub recurse_into_file_modules: bool, /// Name of the root module this parser originated from. If `None`, then the /// name is not known. This does not change while the parser is descending /// into modules, and sub-parsers have new values for this name. @@ -126,7 +128,8 @@ pub struct Parser<'a> { token_cursor: TokenCursor, desugar_doc_comments: bool, /// `true` we should configure out of line modules as we parse. - cfg_mods: bool, + // Public for rustfmt usage. + pub cfg_mods: bool, /// This field is used to keep track of how many left angle brackets we have seen. This is /// required in order to detect extra leading left angle brackets (`<` characters) and error /// appropriately. @@ -483,7 +486,8 @@ impl<'a> Parser<'a> { } } - fn parse_ident(&mut self) -> PResult<'a, ast::Ident> { + // Public for rustfmt usage. + pub fn parse_ident(&mut self) -> PResult<'a, ast::Ident> { self.parse_ident_common(true) } @@ -540,7 +544,8 @@ impl<'a> Parser<'a> { /// If the next token is the given keyword, eats it and returns `true`. /// Otherwise, returns `false`. An expectation is also added for diagnostics purposes. - fn eat_keyword(&mut self, kw: Symbol) -> bool { + // Public for rustfmt usage. + pub fn eat_keyword(&mut self, kw: Symbol) -> bool { if self.check_keyword(kw) { self.bump(); true diff --git a/src/librustc_parse/parser/module.rs b/src/librustc_parse/parser/module.rs index 3254ab5b46325..6ce94d3c6793c 100644 --- a/src/librustc_parse/parser/module.rs +++ b/src/librustc_parse/parser/module.rs @@ -14,13 +14,15 @@ use syntax::token::{self, TokenKind}; use std::path::{self, Path, PathBuf}; /// Information about the path to a module. -pub(super) struct ModulePath { +// Public for rustfmt usage. +pub struct ModulePath { name: String, path_exists: bool, pub result: Result, } -pub(super) struct ModulePathSuccess { +// Public for rustfmt usage. +pub struct ModulePathSuccess { pub path: PathBuf, pub directory_ownership: DirectoryOwnership, } @@ -177,7 +179,8 @@ impl<'a> Parser<'a> { } } - pub(super) fn submod_path_from_attr(attrs: &[Attribute], dir_path: &Path) -> Option { + // Public for rustfmt usage. + pub fn submod_path_from_attr(attrs: &[Attribute], dir_path: &Path) -> Option { if let Some(s) = attr::first_attr_value_str_by_name(attrs, sym::path) { let s = s.as_str(); @@ -194,7 +197,8 @@ impl<'a> Parser<'a> { } /// Returns a path to a module. - pub(super) fn default_submod_path( + // Public for rustfmt usage. + pub fn default_submod_path( id: ast::Ident, relative: Option, dir_path: &Path, From a404cfabc704971d4a9d1dca317fd9f0c325d906 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Sun, 12 Jan 2020 15:25:41 +0900 Subject: [PATCH 07/10] Expose `context::CheckLintNameResult` Clippy needs it --- src/librustc_lint/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 6e3382dee9aae..78e9d0f14f2de 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -76,7 +76,7 @@ use unused::*; /// Useful for other parts of the compiler / Clippy. pub use builtin::SoftLints; -pub use context::{EarlyContext, LateContext, LintContext, LintStore}; +pub use context::{CheckLintNameResult, EarlyContext, LateContext, LintContext, LintStore}; pub use early::check_ast_crate; pub use late::check_crate; pub use passes::{EarlyLintPass, LateLintPass}; From 27b99d405092ac775efe99e520f0f969902906a3 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 13 Jan 2020 00:51:15 +0900 Subject: [PATCH 08/10] Fix crate paths in comments --- src/librustc_feature/lib.rs | 3 ++- src/librustc_lint/builtin.rs | 2 +- .../ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/librustc_feature/lib.rs b/src/librustc_feature/lib.rs index 71a464279253b..01546f7825774 100644 --- a/src/librustc_feature/lib.rs +++ b/src/librustc_feature/lib.rs @@ -1,7 +1,8 @@ //! # Feature gates //! //! This crate declares the set of past and present unstable features in the compiler. -//! Feature gate checking itself is done in `libsyntax/feature_gate/check.rs` at the moment. +//! Feature gate checking itself is done in `librustc_ast_passes/feature_gate.rs` +//! at the moment. //! //! Features are enabled in programs via the crate-level attributes of //! `#![feature(...)]` with a comma-separated list of features. diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 15a8332a28492..6aa809a706ebc 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -1812,7 +1812,7 @@ declare_lint! { } declare_lint_pass!( - /// Check for used feature gates in `INCOMPLETE_FEATURES` in `feature_gate.rs`. + /// Check for used feature gates in `INCOMPLETE_FEATURES` in `librustc_feature/active.rs`. IncompleteFeatures => [INCOMPLETE_FEATURES] ); diff --git a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs index 0d804f012bcc3..92c5c2025022e 100644 --- a/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs +++ b/src/test/ui/feature-gate/issue-43106-gating-of-builtin-attrs.rs @@ -12,7 +12,7 @@ // the change when it happens. // // At the time of authoring, the attributes here are listed in the -// order that they occur in libsyntax/feature_gate.rs. +// order that they occur in `librustc_feature`. // // Any builtin attributes that: // From 34186ef642f1c48e6a27693ad16a3e0fcfd0fddc Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sun, 12 Jan 2020 17:50:14 +0100 Subject: [PATCH 09/10] Clean up E0186 explanation --- src/librustc_error_codes/error_codes/E0186.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/librustc_error_codes/error_codes/E0186.md b/src/librustc_error_codes/error_codes/E0186.md index 9135d5c1d5e9a..7db1e84332387 100644 --- a/src/librustc_error_codes/error_codes/E0186.md +++ b/src/librustc_error_codes/error_codes/E0186.md @@ -2,7 +2,7 @@ An associated function for a trait was defined to be a method (i.e., to take a `self` parameter), but an implementation of the trait declared the same function to be static. -Here's an example of this error: +Erroneous code example: ```compile_fail,E0186 trait Foo { @@ -17,3 +17,19 @@ impl Foo for Bar { fn foo() {} } ``` + +When a type implements a trait's associated function, it has to use the same +signature. So in this case, since `Foo::foo` takes `self` as argument and +does not return anything, its implementation on `Bar` should be the same: + +``` +trait Foo { + fn foo(&self); +} + +struct Bar; + +impl Foo for Bar { + fn foo(&self) {} // ok! +} +``` From 827ee7a70adf923c3202c714b81a3a8b6c9ea29c Mon Sep 17 00:00:00 2001 From: Ruud van Asseldonk Date: Sun, 12 Jan 2020 21:24:31 +0100 Subject: [PATCH 10/10] Fix system call docs for time::Instant The link for UNIX was pointing to the Cloud ABI docs. It should have been pointing to the clock_gettime docs instead. The table is repeated in the docs for SystemTime, but there the UNIX entry was already correct. --- src/libstd/time.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/time.rs b/src/libstd/time.rs index 0dce8f810eb13..0b6e728dceb1d 100644 --- a/src/libstd/time.rs +++ b/src/libstd/time.rs @@ -67,7 +67,7 @@ pub use core::time::Duration; /// |:---------:|:--------------------------------------------------------------------:| /// | Cloud ABI | [clock_time_get (Monotonic Clock)] | /// | SGX | [`insecure_time` usercall]. More information on [timekeeping in SGX] | -/// | UNIX | [clock_time_get (Monotonic Clock)] | +/// | UNIX | [clock_gettime (Monotonic Clock)] | /// | Darwin | [mach_absolute_time] | /// | VXWorks | [clock_gettime (Monotonic Clock)] | /// | WASI | [__wasi_clock_time_get (Monotonic Clock)] |