Auto merge of #46166 - kennytm:rollup, r=kennytm

Rollup of 11 pull requests

- Successful merges: #45987, #46031, #46050, #46052, #46103, #46120, #46134, #46141, #46148, #46155, #46157
- Failed merges:
This commit is contained in:
bors
2017-11-21 17:14:05 +00:00
46 changed files with 395 additions and 465 deletions
+1 -1
View File
@@ -421,7 +421,7 @@ Here are those same steps in detail:
These instructions are specific to updating `rustfmt`, however they may apply These instructions are specific to updating `rustfmt`, however they may apply
to the other submodules as well. Please help by improving these instructions to the other submodules as well. Please help by improving these instructions
if you find any discrepencies or special cases that need to be addressed. if you find any discrepancies or special cases that need to be addressed.
To update the `rustfmt` submodule, start by running the appropriate To update the `rustfmt` submodule, start by running the appropriate
[`git submodule` command](https://git-scm.com/book/en/v2/Git-Tools-Submodules). [`git submodule` command](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
+12 -15
View File
@@ -5,9 +5,6 @@ Language
-------- --------
- [`non_snake_case` lint now allows extern no-mangle functions][44966] - [`non_snake_case` lint now allows extern no-mangle functions][44966]
- [Now accepts underscores in unicode escapes][43716] - [Now accepts underscores in unicode escapes][43716]
- [`#![feature(const_fn)]` is now no longer required for
calling const functions.][43017] It's still required for creating
constant functions.
- [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;` - [`T op= &T` now works for numeric types.][44287] eg. `let mut x = 2; x += &8;`
- [types that impl `Drop` are now allowed in `const` and `static` types][44456] - [types that impl `Drop` are now allowed in `const` and `static` types][44456]
@@ -45,8 +42,8 @@ Cargo
Misc Misc
---- ----
- [`libbacktrace` is now available on Apple platforms.][44251] - [`libbacktrace` is now available on Apple platforms.][44251]
- [Stabilised the `compile_fail` attribute for code fences.][43949] This now - [Stabilised the `compile_fail` attribute for code fences in doc-comments.][43949]
lets you specify that a given code example will fail to compile. This now lets you specify that a given code example will fail to compile.
Compatibility Notes Compatibility Notes
------------------- -------------------
@@ -624,7 +621,7 @@ Misc
---- ----
- [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338] - [rustdoc can now use pulldown-cmark with the `--enable-commonmark` flag][40338]
- [Added rust-winbg script for better debugging on Windows][39983] - [Added rust-windbg script for better debugging on Windows][39983]
- [Rust now uses the official cross compiler for NetBSD][40612] - [Rust now uses the official cross compiler for NetBSD][40612]
- [rustdoc now accepts `#` at the start of files][40828] - [rustdoc now accepts `#` at the start of files][40828]
- [Fixed jemalloc support for musl][41168] - [Fixed jemalloc support for musl][41168]
@@ -1658,7 +1655,7 @@ Diagnostics
----------- -----------
* [Replace macro backtraces with labeled local uses][35702] * [Replace macro backtraces with labeled local uses][35702]
* [Improve error message for missplaced doc comments][33922] * [Improve error message for misplaced doc comments][33922]
* [Buffer unix and lock windows to prevent message interleaving][35975] * [Buffer unix and lock windows to prevent message interleaving][35975]
* [Update lifetime errors to specifically note temporaries][36171] * [Update lifetime errors to specifically note temporaries][36171]
* [Special case a few colors for Windows][36178] * [Special case a few colors for Windows][36178]
@@ -1966,7 +1963,7 @@ Language
useful](https://github.com/rust-lang/rust/pull/34908) useful](https://github.com/rust-lang/rust/pull/34908)
* [`macro_rules!` `stmt` matchers correctly consume the entire contents when * [`macro_rules!` `stmt` matchers correctly consume the entire contents when
inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886) inside non-braces invocations](https://github.com/rust-lang/rust/pull/34886)
* [Semicolons are properly required as statement delimeters inside * [Semicolons are properly required as statement delimiters inside
`macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660) `macro_rules!` invocations](https://github.com/rust-lang/rust/pull/34660)
* [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546) * [`cfg_attr` works on `path` attributes](https://github.com/rust-lang/rust/pull/34546)
@@ -2191,7 +2188,7 @@ Compatibility Notes
* [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443) * [`const`s and `static`s may not have unsized types](https://github.com/rust-lang/rust/pull/34443)
* [The new follow-set rules that place restrictions on `macro_rules!` * [The new follow-set rules that place restrictions on `macro_rules!`
in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982) in order to ensure syntax forward-compatibility have been enabled](https://github.com/rust-lang/rust/pull/33982)
This was an [ammendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384), This was an [amendment to RFC 550](https://github.com/rust-lang/rfcs/pull/1384),
and has been a warning since 1.10. and has been a warning since 1.10.
* [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706). * [`cfg` attribute process has been refactored to fix various bugs](https://github.com/rust-lang/rust/pull/33706).
This causes breakage in some corner cases. This causes breakage in some corner cases.
@@ -3348,7 +3345,7 @@ Libraries
* `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s]. * `FromStr` is [implemented for `SockAddrV4` and `SockAddrV6`][1.5s].
* There are now `From` conversions [between floating point * There are now `From` conversions [between floating point
types][1.5f] where the conversions are lossless. types][1.5f] where the conversions are lossless.
* Thera are now `From` conversions [between integer types][1.5i] where * There are now `From` conversions [between integer types][1.5i] where
the conversions are lossless. the conversions are lossless.
* [`fs::Metadata` implements `Clone`][1.5fs]. * [`fs::Metadata` implements `Clone`][1.5fs].
* The `parse` method [accepts a leading "+" when parsing * The `parse` method [accepts a leading "+" when parsing
@@ -3548,7 +3545,7 @@ Libraries
* [`IntoIterator` is implemented for references to `Option` and * [`IntoIterator` is implemented for references to `Option` and
`Result`][into2]. `Result`][into2].
* [`HashMap` and `HashSet` implement `Extend<&T>` where `T: * [`HashMap` and `HashSet` implement `Extend<&T>` where `T:
Copy`][ext] as part of [RFC 839]. This will cause type inferance Copy`][ext] as part of [RFC 839]. This will cause type inference
breakage in rare situations. breakage in rare situations.
* [`BinaryHeap` implements `Debug`][bh2]. * [`BinaryHeap` implements `Debug`][bh2].
* [`Borrow` and `BorrowMut` are implemented for fixed-size * [`Borrow` and `BorrowMut` are implemented for fixed-size
@@ -3559,7 +3556,7 @@ Libraries
* `&mut T` where `T: std::fmt::Write` [also implements * `&mut T` where `T: std::fmt::Write` [also implements
`std::fmt::Write`][mutw]. `std::fmt::Write`][mutw].
* [A stable regression in `VecDeque::push_back` and other * [A stable regression in `VecDeque::push_back` and other
capicity-altering methods that caused panics for zero-sized types capacity-altering methods that caused panics for zero-sized types
was fixed][vd]. was fixed][vd].
* [Function pointers implement traits for up to 12 parameters][fp2]. * [Function pointers implement traits for up to 12 parameters][fp2].
@@ -3746,7 +3743,7 @@ Libraries
[better for long data][sh]. [better for long data][sh].
* [`AtomicPtr`] implements [`Send`]. * [`AtomicPtr`] implements [`Send`].
* The [`read_to_end`] implementations for [`Stdin`] and [`File`] * The [`read_to_end`] implementations for [`Stdin`] and [`File`]
are now [specialized to use uninitalized buffers for increased are now [specialized to use uninitialized buffers for increased
performance][rte]. performance][rte].
* Lifetime parameters of foreign functions [are now resolved * Lifetime parameters of foreign functions [are now resolved
properly][f]. properly][f].
@@ -3875,7 +3872,7 @@ Highlights
* This is the first release with [experimental support for linking * This is the first release with [experimental support for linking
with the MSVC linker and lib C on Windows (instead of using the GNU with the MSVC linker and lib C on Windows (instead of using the GNU
variants via MinGW)][win]. It is yet recommended only for the most variants via MinGW)][win]. It is yet recommended only for the most
intrepid Rusticians. intrepid Rustaceans.
* Benchmark compilations are showing a 30% improvement in * Benchmark compilations are showing a 30% improvement in
bootstrapping over 1.1. bootstrapping over 1.1.
@@ -4741,7 +4738,7 @@ Version 0.11.0 (2014-07-02)
* Libraries * Libraries
* The standard library is now a "facade" over a number of underlying * The standard library is now a "facade" over a number of underlying
libraries. This means that development on the standard library should libraries. This means that development on the standard library should
be speeder due to smaller crates, as well as a clearer line between be speedier due to smaller crates, as well as a clearer line between
all dependencies. all dependencies.
* A new library, libcore, lives under the standard library's facade * A new library, libcore, lives under the standard library's facade
which is Rust's "0-assumption" library, suitable for embedded and which is Rust's "0-assumption" library, suitable for embedded and
+5
View File
@@ -1168,7 +1168,12 @@ impl Step for Rustfmt {
compiler: builder.compiler(stage, build.build), compiler: builder.compiler(stage, build.build),
target target
}).expect("Rustfmt to build: toolstate is testing"); }).expect("Rustfmt to build: toolstate is testing");
let cargofmt = builder.ensure(tool::Cargofmt {
compiler: builder.compiler(stage, build.build),
target
}).expect("Cargofmt to build: toolstate is testing");
install(&rustfmt, &image.join("bin"), 0o755); install(&rustfmt, &image.join("bin"), 0o755);
install(&cargofmt, &image.join("bin"), 0o755);
let doc = image.join("share/doc/rustfmt"); let doc = image.join("share/doc/rustfmt");
install(&src.join("README.md"), &doc, 0o644); install(&src.join("README.md"), &doc, 0o644);
install(&src.join("LICENSE-MIT"), &doc, 0o644); install(&src.join("LICENSE-MIT"), &doc, 0o644);
+1 -1
View File
@@ -185,7 +185,7 @@ pub unsafe fn setup(build: &mut Build) {
0, FALSE, DUPLICATE_SAME_ACCESS); 0, FALSE, DUPLICATE_SAME_ACCESS);
// If this failed, well at least we tried! An example of DuplicateHandle // If this failed, well at least we tried! An example of DuplicateHandle
// failing in the past has been when the wrong python2 package spawed this // failing in the past has been when the wrong python2 package spawned this
// build system (e.g. the `python2` package in MSYS instead of // build system (e.g. the `python2` package in MSYS instead of
// `mingw-w64-x86_64-python2`. Not sure why it failed, but the "failure // `mingw-w64-x86_64-python2`. Not sure why it failed, but the "failure
// mode" here is that we only clean everything up when the build system // mode" here is that we only clean everything up when the build system
+1 -1
View File
@@ -78,7 +78,7 @@ pub fn check(build: &mut Build) {
} }
let mut cmd_finder = Finder::new(); let mut cmd_finder = Finder::new();
// If we've got a git directory we're gona need git to update // If we've got a git directory we're gonna need git to update
// submodules and learn about various other aspects. // submodules and learn about various other aspects.
if build.rust_info.is_git() { if build.rust_info.is_git() {
cmd_finder.must_have("git"); cmd_finder.must_have("git");
+55 -138
View File
@@ -403,71 +403,66 @@ impl Step for Cargo {
} }
} }
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] macro_rules! tool_extended {
pub struct Clippy { (($sel:ident, $builder:ident),
pub compiler: Compiler, $($name:ident,
pub target: Interned<String>, $toolstate:ident,
$path:expr,
$tool_name:expr,
$extra_deps:block;)+) => {
$(
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub struct $name {
pub compiler: Compiler,
pub target: Interned<String>,
}
impl Step for $name {
type Output = Option<PathBuf>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun) -> ShouldRun {
let builder = run.builder;
run.path($path).default_condition(builder.build.config.extended)
}
fn make_run(run: RunConfig) {
run.builder.ensure($name {
compiler: run.builder.compiler(run.builder.top_stage, run.builder.build.build),
target: run.target,
});
}
fn run($sel, $builder: &Builder) -> Option<PathBuf> {
$extra_deps
let toolstate = $builder.build.config.toolstate.$toolstate;
$builder.ensure(ToolBuild {
compiler: $sel.compiler,
target: $sel.target,
tool: $tool_name,
mode: Mode::Librustc,
path: $path,
expectation: toolstate.passes(ToolState::Compiling),
})
}
}
)+
}
} }
impl Step for Clippy { tool_extended!((self, builder),
type Output = Option<PathBuf>; Cargofmt, rustfmt, "src/tools/rustfmt", "cargo-fmt", {};
const DEFAULT: bool = true; Clippy, clippy, "src/tools/clippy", "clippy-driver", {
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun) -> ShouldRun {
let builder = run.builder;
run.path("src/tools/clippy").default_condition(builder.build.config.extended)
}
fn make_run(run: RunConfig) {
run.builder.ensure(Clippy {
compiler: run.builder.compiler(run.builder.top_stage, run.builder.build.build),
target: run.target,
});
}
fn run(self, builder: &Builder) -> Option<PathBuf> {
// Clippy depends on procedural macros (serde), which requires a full host // Clippy depends on procedural macros (serde), which requires a full host
// compiler to be available, so we need to depend on that. // compiler to be available, so we need to depend on that.
builder.ensure(compile::Rustc { builder.ensure(compile::Rustc {
compiler: self.compiler, compiler: self.compiler,
target: builder.build.build, target: builder.build.build,
}); });
builder.ensure(ToolBuild { };
compiler: self.compiler, Miri, miri, "src/tools/miri", "miri", {};
target: self.target, Rls, rls, "src/tools/rls", "rls", {
tool: "clippy-driver",
mode: Mode::Librustc,
path: "src/tools/clippy",
expectation: builder.build.config.toolstate.clippy.passes(ToolState::Compiling),
})
}
}
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub struct Rls {
pub compiler: Compiler,
pub target: Interned<String>,
}
impl Step for Rls {
type Output = Option<PathBuf>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun) -> ShouldRun {
let builder = run.builder;
run.path("src/tools/rls").default_condition(builder.build.config.extended)
}
fn make_run(run: RunConfig) {
run.builder.ensure(Rls {
compiler: run.builder.compiler(run.builder.top_stage, run.builder.build.build),
target: run.target,
});
}
fn run(self, builder: &Builder) -> Option<PathBuf> {
builder.ensure(native::Openssl { builder.ensure(native::Openssl {
target: self.target, target: self.target,
}); });
@@ -477,87 +472,9 @@ impl Step for Rls {
compiler: self.compiler, compiler: self.compiler,
target: builder.build.build, target: builder.build.build,
}); });
builder.ensure(ToolBuild { };
compiler: self.compiler, Rustfmt, rustfmt, "src/tools/rustfmt", "rustfmt", {};
target: self.target, );
tool: "rls",
mode: Mode::Librustc,
path: "src/tools/rls",
expectation: builder.build.config.toolstate.rls.passes(ToolState::Compiling),
})
}
}
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub struct Rustfmt {
pub compiler: Compiler,
pub target: Interned<String>,
}
impl Step for Rustfmt {
type Output = Option<PathBuf>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun) -> ShouldRun {
let builder = run.builder;
run.path("src/tools/rustfmt").default_condition(builder.build.config.extended)
}
fn make_run(run: RunConfig) {
run.builder.ensure(Rustfmt {
compiler: run.builder.compiler(run.builder.top_stage, run.builder.build.build),
target: run.target,
});
}
fn run(self, builder: &Builder) -> Option<PathBuf> {
builder.ensure(ToolBuild {
compiler: self.compiler,
target: self.target,
tool: "rustfmt",
mode: Mode::Librustc,
path: "src/tools/rustfmt",
expectation: builder.build.config.toolstate.rustfmt.passes(ToolState::Compiling),
})
}
}
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub struct Miri {
pub compiler: Compiler,
pub target: Interned<String>,
}
impl Step for Miri {
type Output = Option<PathBuf>;
const DEFAULT: bool = true;
const ONLY_HOSTS: bool = true;
fn should_run(run: ShouldRun) -> ShouldRun {
let build_miri = run.builder.build.config.test_miri;
run.path("src/tools/miri").default_condition(build_miri)
}
fn make_run(run: RunConfig) {
run.builder.ensure(Miri {
compiler: run.builder.compiler(run.builder.top_stage, run.builder.build.build),
target: run.target,
});
}
fn run(self, builder: &Builder) -> Option<PathBuf> {
builder.ensure(ToolBuild {
compiler: self.compiler,
target: self.target,
tool: "miri",
mode: Mode::Librustc,
path: "src/tools/miri",
expectation: builder.build.config.toolstate.miri.passes(ToolState::Compiling),
})
}
}
impl<'a> Builder<'a> { impl<'a> Builder<'a> {
/// Get a `Command` which is ready to run `tool` in `stage` built for /// Get a `Command` which is ready to run `tool` in `stage` built for
+2 -2
View File
@@ -36,14 +36,14 @@ a Docker image.
1. Select the "default" virtual machine inside VirtualBox, then click 1. Select the "default" virtual machine inside VirtualBox, then click
"Settings" "Settings"
2. Go to "Shared Folders", click "Add shared foldrer" (the folder icon with 2. Go to "Shared Folders", click "Add shared folder" (the folder icon with
a plus sign), fill in the following information, then click "OK": a plus sign), fill in the following information, then click "OK":
* Folder path: `E:\rust` * Folder path: `E:\rust`
* Folder name: `e/rust` * Folder name: `e/rust`
* Read-only: ☐ *unchecked* * Read-only: ☐ *unchecked*
* Auto-mount: ☑ *checked* * Auto-mount: ☑ *checked*
* Make Permanant: ☑ *checked* * Make Permanent: ☑ *checked*
3. VirtualBox might not support creating symbolic links inside a shared folder 3. VirtualBox might not support creating symbolic links inside a shared folder
by default. You can enable it manually by running these from `cmd.exe`: by default. You can enable it manually by running these from `cmd.exe`:
@@ -52,7 +52,7 @@ curl $URL/2017-03-17-netbsd-comp.tgz | \
cd usr/src cd usr/src
# The options, in order, do the following # The options, in order, do the following
# * this is an unpriviledged build # * this is an unprivileged build
# * output to a predictable location # * output to a predictable location
# * disable various uneeded stuff # * disable various uneeded stuff
MKUNPRIVED=yes TOOLDIR=/x-tools/x86_64-unknown-netbsd \ MKUNPRIVED=yes TOOLDIR=/x-tools/x86_64-unknown-netbsd \
+1 -1
View File
@@ -37,7 +37,7 @@ if [ "$DIST_SRC" = "" ]; then
fi fi
# If we're deploying artifacts then we set the release channel, otherwise if # If we're deploying artifacts then we set the release channel, otherwise if
# we're not deploying then we want to be sure to enable all assertions becauase # we're not deploying then we want to be sure to enable all assertions because
# we'll be running tests # we'll be running tests
# #
# FIXME: need a scheme for changing this `nightly` value to `beta` and `stable` # FIXME: need a scheme for changing this `nightly` value to `beta` and `stable`
@@ -279,7 +279,7 @@ $ rustdoc README.md --markdown-playground-url https://play.rust-lang.org/
``` ```
When rendering a Markdown file, this flag gives the base URL of the Rust When rendering a Markdown file, this flag gives the base URL of the Rust
Playround, to use for generating `Run` buttons. Playground, to use for generating `Run` buttons.
## `--markdown-no-toc`: don't generate a table of contents ## `--markdown-no-toc`: don't generate a table of contents
@@ -291,7 +291,7 @@ $ rustdoc README.md --markdown-no-toc
``` ```
When generating documentation from a Markdown file, by default, `rustdoc` will When generating documentation from a Markdown file, by default, `rustdoc` will
generate a table of contents. This flag supresses that, and no TOC will be generate a table of contents. This flag suppresses that, and no TOC will be
generated. generated.
+1 -1
View File
@@ -50,7 +50,7 @@ running them. Here's the full algorithm rustdoc uses to preprocess examples:
5. Finally, if the example does not contain `fn main`, the remainder of the 5. Finally, if the example does not contain `fn main`, the remainder of the
text is wrapped in `fn main() { your_code }`. text is wrapped in `fn main() { your_code }`.
For more about that caveat in rule 4, see "Documeting Macros" below. For more about that caveat in rule 4, see "Documenting Macros" below.
## Hiding portions of the example ## Hiding portions of the example
@@ -10,7 +10,7 @@ The `optin_builtin_traits` feature gate allows you to define auto traits.
Auto traits, like [`Send`] or [`Sync`] in the standard library, are marker traits Auto traits, like [`Send`] or [`Sync`] in the standard library, are marker traits
that are automatically implemented for every type, unless the type, or a type it contains, that are automatically implemented for every type, unless the type, or a type it contains,
has explictly opted out via a negative impl. has explicitly opted out via a negative impl.
[`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html
[`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html
@@ -9,7 +9,7 @@ See Also: [`fn_traits`](library-features/fn-traits.html)
---- ----
The `unboxed_closures` feature allows you to write functions using the `"rust-call"` ABI, The `unboxed_closures` feature allows you to write functions using the `"rust-call"` ABI,
required for implmenting the [`Fn*`] family of traits. `"rust-call"` functions must have required for implementing the [`Fn*`] family of traits. `"rust-call"` functions must have
exactly one (non self) argument, a tuple representing the argument list. exactly one (non self) argument, a tuple representing the argument list.
[`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html [`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html
+1 -1
View File
@@ -144,7 +144,7 @@ begin
end; end;
end; end;
// Split a string into an array using passed delimeter // Split a string into an array using passed delimiter
procedure Explode(var Dest: TArrayOfString; Text: String; Separator: String); procedure Explode(var Dest: TArrayOfString; Text: String; Separator: String);
var var
i: Integer; i: Integer;
+1 -1
View File
@@ -536,7 +536,7 @@ use string;
/// assert_eq!(s, "Hello, world!"); /// assert_eq!(s, "Hello, world!");
/// ``` /// ```
/// ///
/// Please note that using [`format!`] might be preferrable. /// Please note that using [`format!`] might be preferable.
/// Example: /// Example:
/// ///
/// ``` /// ```
+1 -1
View File
@@ -72,7 +72,7 @@ macro_rules! vec {
/// Creates a `String` using interpolation of runtime expressions. /// Creates a `String` using interpolation of runtime expressions.
/// ///
/// The first argument `format!` recieves is a format string. This must be a string /// The first argument `format!` receives is a format string. This must be a string
/// literal. The power of the formatting string is in the `{}`s contained. /// literal. The power of the formatting string is in the `{}`s contained.
/// ///
/// Additional parameters passed to `format!` replace the `{}`s within the /// Additional parameters passed to `format!` replace the `{}`s within the
+1 -1
View File
@@ -346,7 +346,7 @@ impl<T> Rc<T> {
unsafe { unsafe {
let val = ptr::read(&*this); // copy the contained object let val = ptr::read(&*this); // copy the contained object
// Indicate to Weaks that they can't be promoted by decrememting // Indicate to Weaks that they can't be promoted by decrementing
// the strong count, and then remove the implicit "strong weak" // the strong count, and then remove the implicit "strong weak"
// pointer while also handling drop logic by just crafting a // pointer while also handling drop logic by just crafting a
// fake Weak. // fake Weak.
+1 -1
View File
@@ -596,7 +596,7 @@ impl String {
/// Decode a UTF-16 encoded vector `v` into a `String`, returning [`Err`] /// Decode a UTF-16 encoded vector `v` into a `String`, returning [`Err`]
/// if `v` contains any invalid data. /// if `v` contains any invalid data.
/// ///
/// [`Err`]: ../../std/result/enum.Result.htlm#variant.Err /// [`Err`]: ../../std/result/enum.Result.html#variant.Err
/// ///
/// # Examples /// # Examples
/// ///
+3 -3
View File
@@ -1427,12 +1427,12 @@ mod pattern {
Reject(6, 7), Reject(6, 7),
Match (7, 7), Match (7, 7),
]); ]);
make_test!(str_searcher_mulibyte_haystack, " ", "├──", [ make_test!(str_searcher_multibyte_haystack, " ", "├──", [
Reject(0, 3), Reject(0, 3),
Reject(3, 6), Reject(3, 6),
Reject(6, 9), Reject(6, 9),
]); ]);
make_test!(str_searcher_empty_needle_mulibyte_haystack, "", "├──", [ make_test!(str_searcher_empty_needle_multibyte_haystack, "", "├──", [
Match (0, 0), Match (0, 0),
Reject(0, 3), Reject(0, 3),
Match (3, 3), Match (3, 3),
@@ -1455,7 +1455,7 @@ mod pattern {
Match (5, 6), Match (5, 6),
Reject(6, 7), Reject(6, 7),
]); ]);
make_test!(char_searcher_mulibyte_haystack, ' ', "├──", [ make_test!(char_searcher_multibyte_haystack, ' ', "├──", [
Reject(0, 3), Reject(0, 3),
Reject(3, 6), Reject(3, 6),
Reject(6, 9), Reject(6, 9),
+1 -1
View File
@@ -1089,7 +1089,7 @@ impl<T> Vec<T> {
// Memory safety // Memory safety
// //
// When the Drain is first created, it shortens the length of // When the Drain is first created, it shortens the length of
// the source vector to make sure no uninitalized or moved-from elements // the source vector to make sure no uninitialized or moved-from elements
// are accessible at all if the Drain's destructor never gets to run. // are accessible at all if the Drain's destructor never gets to run.
// //
// Drain will ptr::read out the values to remove. // Drain will ptr::read out the values to remove.
+1 -1
View File
@@ -14584,7 +14584,7 @@ func_basename ()
# to NONDIR_REPLACEMENT. # to NONDIR_REPLACEMENT.
# value returned in "$func_dirname_result" # value returned in "$func_dirname_result"
# basename: Compute filename of FILE. # basename: Compute filename of FILE.
# value retuned in "$func_basename_result" # value returned in "$func_basename_result"
# Implementation must be kept synchronized with func_dirname # Implementation must be kept synchronized with func_dirname
# and func_basename. For efficiency, we do not delegate to # and func_basename. For efficiency, we do not delegate to
# those functions but instead duplicate the functionality here. # those functions but instead duplicate the functionality here.
+1 -1
View File
@@ -177,7 +177,7 @@ basename="s,^.*/,,"
# to NONDIR_REPLACEMENT. # to NONDIR_REPLACEMENT.
# value returned in "$func_dirname_result" # value returned in "$func_dirname_result"
# basename: Compute filename of FILE. # basename: Compute filename of FILE.
# value retuned in "$func_basename_result" # value returned in "$func_basename_result"
# Implementation must be kept synchronized with func_dirname # Implementation must be kept synchronized with func_dirname
# and func_basename. For efficiency, we do not delegate to # and func_basename. For efficiency, we do not delegate to
# those functions but instead duplicate the functionality here. # those functions but instead duplicate the functionality here.
+1 -1
View File
@@ -952,7 +952,7 @@ pub trait UpperExp {
/// assert_eq!(output, "Hello world!"); /// assert_eq!(output, "Hello world!");
/// ``` /// ```
/// ///
/// Please note that using [`write!`] might be preferrable. Example: /// Please note that using [`write!`] might be preferable. Example:
/// ///
/// ``` /// ```
/// use std::fmt::Write; /// use std::fmt::Write;
+7 -5
View File
@@ -17,8 +17,8 @@ use std::u32;
newtype_index!(CrateNum newtype_index!(CrateNum
{ {
derive[Debug]
ENCODABLE = custom ENCODABLE = custom
DEBUG_FORMAT = "crate{}",
/// Item definitions in the currently-compiled crate would have the CrateNum /// Item definitions in the currently-compiled crate would have the CrateNum
/// LOCAL_CRATE in their DefId. /// LOCAL_CRATE in their DefId.
@@ -172,17 +172,19 @@ pub struct DefId {
impl fmt::Debug for DefId { impl fmt::Debug for DefId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "DefId {{ krate: {:?}, index: {:?}", write!(f, "DefId({:?}/{}:{}",
self.krate, self.index)?; self.krate.index(),
self.index.address_space().index(),
self.index.as_array_index())?;
ty::tls::with_opt(|opt_tcx| { ty::tls::with_opt(|opt_tcx| {
if let Some(tcx) = opt_tcx { if let Some(tcx) = opt_tcx {
write!(f, " => {}", tcx.def_path_debug_str(*self))?; write!(f, " ~ {}", tcx.def_path_debug_str(*self))?;
} }
Ok(()) Ok(())
})?; })?;
write!(f, " }}") write!(f, ")")
} }
} }
+14 -9
View File
@@ -531,13 +531,15 @@ impl<'a, 'tcx> DeadVisitor<'a, 'tcx> {
id: ast::NodeId, id: ast::NodeId,
span: syntax_pos::Span, span: syntax_pos::Span,
name: ast::Name, name: ast::Name,
node_type: &str) { node_type: &str,
participle: &str) {
if !name.as_str().starts_with("_") { if !name.as_str().starts_with("_") {
self.tcx self.tcx
.lint_node(lint::builtin::DEAD_CODE, .lint_node(lint::builtin::DEAD_CODE,
id, id,
span, span,
&format!("{} is never used: `{}`", node_type, name)); &format!("{} is never {}: `{}`",
node_type, participle, name));
} }
} }
} }
@@ -570,7 +572,8 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
item.id, item.id,
span, span,
item.name, item.name,
item.node.descriptive_variant() item.node.descriptive_variant(),
"used",
); );
} else { } else {
// Only continue if we didn't warn // Only continue if we didn't warn
@@ -583,7 +586,8 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
g: &'tcx hir::Generics, g: &'tcx hir::Generics,
id: ast::NodeId) { id: ast::NodeId) {
if self.should_warn_about_variant(&variant.node) { if self.should_warn_about_variant(&variant.node) {
self.warn_dead_code(variant.node.data.id(), variant.span, variant.node.name, "variant"); self.warn_dead_code(variant.node.data.id(), variant.span, variant.node.name,
"variant", "constructed");
} else { } else {
intravisit::walk_variant(self, variant, g, id); intravisit::walk_variant(self, variant, g, id);
} }
@@ -591,15 +595,15 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem) {
if self.should_warn_about_foreign_item(fi) { if self.should_warn_about_foreign_item(fi) {
self.warn_dead_code(fi.id, fi.span, fi.name, fi.node.descriptive_variant()); self.warn_dead_code(fi.id, fi.span, fi.name,
fi.node.descriptive_variant(), "used");
} }
intravisit::walk_foreign_item(self, fi); intravisit::walk_foreign_item(self, fi);
} }
fn visit_struct_field(&mut self, field: &'tcx hir::StructField) { fn visit_struct_field(&mut self, field: &'tcx hir::StructField) {
if self.should_warn_about_field(&field) { if self.should_warn_about_field(&field) {
self.warn_dead_code(field.id, field.span, self.warn_dead_code(field.id, field.span, field.name, "field", "used");
field.name, "field");
} }
intravisit::walk_struct_field(self, field); intravisit::walk_struct_field(self, field);
} }
@@ -611,14 +615,15 @@ impl<'a, 'tcx> Visitor<'tcx> for DeadVisitor<'a, 'tcx> {
self.warn_dead_code(impl_item.id, self.warn_dead_code(impl_item.id,
impl_item.span, impl_item.span,
impl_item.name, impl_item.name,
"associated const"); "associated const",
"used");
} }
self.visit_nested_body(body_id) self.visit_nested_body(body_id)
} }
hir::ImplItemKind::Method(_, body_id) => { hir::ImplItemKind::Method(_, body_id) => {
if !self.symbol_is_live(impl_item.id, None) { if !self.symbol_is_live(impl_item.id, None) {
let span = self.tcx.sess.codemap().def_span(impl_item.span); let span = self.tcx.sess.codemap().def_span(impl_item.span);
self.warn_dead_code(impl_item.id, span, impl_item.name, "method"); self.warn_dead_code(impl_item.id, span, impl_item.name, "method", "used");
} }
self.visit_nested_body(body_id) self.visit_nested_body(body_id)
} }
+1 -1
View File
@@ -111,7 +111,7 @@ impl<A: Array> ArrayVec<A> {
// Memory safety // Memory safety
// //
// When the Drain is first created, it shortens the length of // When the Drain is first created, it shortens the length of
// the source vector to make sure no uninitalized or moved-from elements // the source vector to make sure no uninitialized or moved-from elements
// are accessible at all if the Drain's destructor never gets to run. // are accessible at all if the Drain's destructor never gets to run.
// //
// Drain will ptr::read out the values to remove. // Drain will ptr::read out the values to remove.
+1 -1
View File
@@ -70,7 +70,7 @@ impl MultilineAnnotation {
pub fn as_end(&self) -> Annotation { pub fn as_end(&self) -> Annotation {
Annotation { Annotation {
start_col: self.end_col - 1, start_col: self.end_col.saturating_sub(1),
end_col: self.end_col, end_col: self.end_col,
is_primary: self.is_primary, is_primary: self.is_primary,
label: self.label.clone(), label: self.label.clone(),
+19 -9
View File
@@ -3680,18 +3680,24 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
} }
let mut links = HashSet::new(); let mut links = HashSet::new();
let ret = v.iter() let ret = v.iter()
.filter_map(|i| if let Some(ref i) = i.inner_impl().trait_ { .filter_map(|i| {
let i_display = format!("{:#}", i); let is_negative_impl = is_negative_impl(i.inner_impl());
let out = Escape(&i_display); if let Some(ref i) = i.inner_impl().trait_ {
let encoded = small_url_encode(&format!("{:#}", i)); let i_display = format!("{:#}", i);
let generated = format!("<a href=\"#impl-{}\">{}</a>", encoded, out); let out = Escape(&i_display);
if !links.contains(&generated) && links.insert(generated.clone()) { let encoded = small_url_encode(&format!("{:#}", i));
Some(generated) let generated = format!("<a href=\"#impl-{}\">{}{}</a>",
encoded,
if is_negative_impl { "!" } else { "" },
out);
if !links.contains(&generated) && links.insert(generated.clone()) {
Some(generated)
} else {
None
}
} else { } else {
None None
} }
} else {
None
}) })
.collect::<String>(); .collect::<String>();
if !ret.is_empty() { if !ret.is_empty() {
@@ -3738,6 +3744,10 @@ fn extract_for_impl_name(item: &clean::Item) -> Option<(String, String)> {
} }
} }
fn is_negative_impl(i: &clean::Impl) -> bool {
i.polarity == Some(clean::ImplPolarity::Negative)
}
fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item, fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
t: &clean::Trait) -> fmt::Result { t: &clean::Trait) -> fmt::Result {
let mut sidebar = String::new(); let mut sidebar = String::new();
+3 -6
View File
@@ -366,16 +366,13 @@ fn append_to_string<F>(buf: &mut String, f: F) -> Result<usize>
fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> { fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> {
let start_len = buf.len(); let start_len = buf.len();
let mut g = Guard { len: buf.len(), buf: buf }; let mut g = Guard { len: buf.len(), buf: buf };
let mut new_write_size = 16;
let ret; let ret;
loop { loop {
if g.len == g.buf.len() { if g.len == g.buf.len() {
if new_write_size < DEFAULT_BUF_SIZE {
new_write_size *= 2;
}
unsafe { unsafe {
g.buf.reserve(new_write_size); g.buf.reserve(32);
g.buf.set_len(g.len + new_write_size); let capacity = g.buf.capacity();
g.buf.set_len(capacity);
r.initializer().initialize(&mut g.buf[g.len..]); r.initializer().initialize(&mut g.buf[g.len..]);
} }
} }
+1 -1
View File
@@ -759,7 +759,7 @@ impl hash::Hash for SocketAddrV6 {
/// ``` /// ```
/// ///
/// [`TcpStream::connect`] is an example of an function that utilizes /// [`TcpStream::connect`] is an example of an function that utilizes
/// `ToSocketsAddr` as a trait bound on its parameter in order to accept /// `ToSocketAddrs` as a trait bound on its parameter in order to accept
/// different types: /// different types:
/// ///
/// ```no_run /// ```no_run
+1 -1
View File
@@ -3752,7 +3752,7 @@ mod tests {
} }
#[test] #[test]
fn test_eq_recievers() { fn test_eq_receivers() {
use borrow::Cow; use borrow::Cow;
let borrowed: &Path = Path::new("foo/bar"); let borrowed: &Path = Path::new("foo/bar");
+25 -3
View File
@@ -24,11 +24,12 @@ use syntax_pos::{self, MacroBacktrace, Span, SpanLabel, MultiSpan};
use errors::registry::Registry; use errors::registry::Registry;
use errors::{DiagnosticBuilder, SubDiagnostic, CodeSuggestion, CodeMapper}; use errors::{DiagnosticBuilder, SubDiagnostic, CodeSuggestion, CodeMapper};
use errors::DiagnosticId; use errors::DiagnosticId;
use errors::emitter::Emitter; use errors::emitter::{Emitter, EmitterWriter};
use std::rc::Rc; use std::rc::Rc;
use std::io::{self, Write}; use std::io::{self, Write};
use std::vec; use std::vec;
use std::sync::{Arc, Mutex};
use rustc_serialize::json::{as_json, as_pretty_json}; use rustc_serialize::json::{as_json, as_pretty_json};
@@ -95,7 +96,7 @@ struct Diagnostic {
spans: Vec<DiagnosticSpan>, spans: Vec<DiagnosticSpan>,
/// Associated diagnostic messages. /// Associated diagnostic messages.
children: Vec<Diagnostic>, children: Vec<Diagnostic>,
/// The message as rustc would render it. Currently this is always `None` /// The message as rustc would render it.
rendered: Option<String>, rendered: Option<String>,
} }
@@ -170,6 +171,27 @@ impl Diagnostic {
rendered: None, rendered: None,
} }
}); });
// generate regular command line output and store it in the json
// A threadsafe buffer for writing.
#[derive(Default, Clone)]
struct BufWriter(Arc<Mutex<Vec<u8>>>);
impl Write for BufWriter {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.lock().unwrap().write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.0.lock().unwrap().flush()
}
}
let buf = BufWriter::default();
let output = buf.clone();
EmitterWriter::new(Box::new(buf), Some(je.cm.clone()), false).emit(db);
let output = Arc::try_unwrap(output.0).unwrap().into_inner().unwrap();
let output = String::from_utf8(output).unwrap();
Diagnostic { Diagnostic {
message: db.message(), message: db.message(),
code: DiagnosticCode::map_opt_string(db.code.clone(), je), code: DiagnosticCode::map_opt_string(db.code.clone(), je),
@@ -178,7 +200,7 @@ impl Diagnostic {
children: db.children.iter().map(|c| { children: db.children.iter().map(|c| {
Diagnostic::from_sub_diagnostic(c, je) Diagnostic::from_sub_diagnostic(c, je)
}).chain(sugg).collect(), }).chain(sugg).collect(),
rendered: None, rendered: Some(output),
} }
} }
+1 -1
View File
@@ -74,7 +74,7 @@ pub enum pub_enum3 {
enum priv_enum { foo2, bar2 } //~ ERROR: enum is never used enum priv_enum { foo2, bar2 } //~ ERROR: enum is never used
enum used_enum { enum used_enum {
foo3, foo3,
bar3 //~ ERROR variant is never used bar3 //~ ERROR variant is never constructed
} }
fn f<T>() {} fn f<T>() {}
+4 -4
View File
@@ -22,8 +22,8 @@ fn field_read(f: Foo) -> usize {
} }
enum XYZ { enum XYZ {
X, //~ ERROR variant is never used X, //~ ERROR variant is never constructed
Y { //~ ERROR variant is never used Y { //~ ERROR variant is never constructed
a: String, a: String,
b: i32, b: i32,
c: i32, c: i32,
@@ -43,13 +43,13 @@ enum ABC { //~ ERROR enum is never used
// ensure struct variants get warning for their fields // ensure struct variants get warning for their fields
enum IJK { enum IJK {
I, //~ ERROR variant is never used I, //~ ERROR variant is never constructed
J { J {
a: String, a: String,
b: i32, //~ ERROR field is never used b: i32, //~ ERROR field is never used
c: i32, //~ ERROR field is never used c: i32, //~ ERROR field is never used
}, },
K //~ ERROR variant is never used K //~ ERROR variant is never constructed
} }
+3 -3
View File
@@ -13,15 +13,15 @@
enum Enum1 { enum Enum1 {
Variant1(isize), Variant1(isize),
Variant2 //~ ERROR: variant is never used Variant2 //~ ERROR: variant is never constructed
} }
enum Enum2 { enum Enum2 {
Variant3(bool), Variant3(bool),
#[allow(dead_code)] #[allow(dead_code)]
Variant4(isize), Variant4(isize),
Variant5 { _x: isize }, //~ ERROR: variant is never used: `Variant5` Variant5 { _x: isize }, //~ ERROR: variant is never constructed: `Variant5`
Variant6(isize), //~ ERROR: variant is never used: `Variant6` Variant6(isize), //~ ERROR: variant is never constructed: `Variant6`
_Variant7, _Variant7,
} }
@@ -12,7 +12,7 @@
#[derive(Clone)] #[derive(Clone)]
enum Enum { enum Enum {
Variant1, //~ ERROR: variant is never used Variant1, //~ ERROR: variant is never constructed
Variant2, Variant2,
} }
+36 -210
View File
@@ -32,26 +32,9 @@ pub fn change_name() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_clean(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_name() { pub fn change_name() {
let _y = 2u64; let _y = 2u64;
} }
@@ -65,26 +48,11 @@ pub fn add_type() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_clean(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_clean(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn add_type() { pub fn add_type() {
let _x: u32 = 2u32; let _x: u32 = 2u32;
} }
@@ -98,26 +66,11 @@ pub fn change_type() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_type() { pub fn change_type() {
let _x: u8 = 2; let _x: u8 = 2;
} }
@@ -131,26 +84,11 @@ pub fn change_mutability_of_reference_type() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_clean(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_mutability_of_reference_type() { pub fn change_mutability_of_reference_type() {
let _x: &mut u64; let _x: &mut u64;
} }
@@ -164,26 +102,11 @@ pub fn change_mutability_of_slot() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_mutability_of_slot() { pub fn change_mutability_of_slot() {
let _x: u64 = 0; let _x: u64 = 0;
} }
@@ -197,26 +120,11 @@ pub fn change_simple_binding_to_pattern() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_simple_binding_to_pattern() { pub fn change_simple_binding_to_pattern() {
let (_a, _b) = (0u8, 'x'); let (_a, _b) = (0u8, 'x');
} }
@@ -230,26 +138,11 @@ pub fn change_name_in_pattern() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_clean(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_name_in_pattern() { pub fn change_name_in_pattern() {
let (_a, _c) = (1u8, 'y'); let (_a, _c) = (1u8, 'y');
} }
@@ -263,26 +156,11 @@ pub fn add_ref_in_pattern() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn add_ref_in_pattern() { pub fn add_ref_in_pattern() {
let (ref _a, _b) = (1u8, 'y'); let (ref _a, _b) = (1u8, 'y');
} }
@@ -296,18 +174,11 @@ pub fn add_amp_in_pattern() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
pub fn add_amp_in_pattern() { pub fn add_amp_in_pattern() {
let (&_a, _b) = (&1u8, 'y'); let (&_a, _b) = (&1u8, 'y');
} }
@@ -321,26 +192,11 @@ pub fn change_mutability_of_binding_in_pattern() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_mutability_of_binding_in_pattern() { pub fn change_mutability_of_binding_in_pattern() {
let (mut _a, _b) = (99u8, 'q'); let (mut _a, _b) = (99u8, 'q');
} }
@@ -354,26 +210,11 @@ pub fn add_initializer() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,TypeckTables,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_dirty(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn add_initializer() { pub fn add_initializer() {
let _x: i16 = 3i16; let _x: i16 = 3i16;
} }
@@ -387,26 +228,11 @@ pub fn change_initializer() {
} }
#[cfg(not(cfail1))] #[cfg(not(cfail1))]
#[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(cfg="cfail2",
#[rustc_clean(label="Hir", cfg="cfail3")] except="HirBody,MirValidated,MirOptimized")]
#[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(label="HirBody", cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
#[rustc_dirty(label="MirValidated", cfg="cfail2")]
#[rustc_clean(label="MirValidated", cfg="cfail3")]
#[rustc_dirty(label="MirOptimized", cfg="cfail2")]
#[rustc_clean(label="MirOptimized", cfg="cfail3")]
#[rustc_clean(label="TypeckTables", cfg="cfail2")]
#[rustc_clean(label="TypeckTables", cfg="cfail3")]
#[rustc_clean(label="TypeOfItem", cfg="cfail2")]
#[rustc_clean(label="TypeOfItem", cfg="cfail3")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail2")]
#[rustc_clean(label="GenericsOfItem", cfg="cfail3")]
#[rustc_clean(label="FnSignature", cfg="cfail2")]
#[rustc_clean(label="FnSignature", cfg="cfail3")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail2")]
#[rustc_clean(label="PredicatesOfItem", cfg="cfail3")]
pub fn change_initializer() { pub fn change_initializer() {
let _x = 5u16; let _x = 5u16;
} }
+1 -1
View File
@@ -12,7 +12,7 @@
// artificial cycles: during type-checking, we had to get the MIR for // artificial cycles: during type-checking, we had to get the MIR for
// the constant expressions in `[u8; 2]`, which in turn would trigger // the constant expressions in `[u8; 2]`, which in turn would trigger
// an attempt to get the item-path, which in turn would request the // an attempt to get the item-path, which in turn would request the
// types of the impl, which would trigger a cycle. We supressed this // types of the impl, which would trigger a cycle. We suppressed this
// cycle now by forcing mir-dump to avoid asking for types of an impl. // cycle now by forcing mir-dump to avoid asking for types of an impl.
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
+2 -2
View File
@@ -30,7 +30,7 @@ fn main() {
// END RUST SOURCE // END RUST SOURCE
// START rustc.{{impl}}-foo.EraseRegions.after.mir // START rustc.{{impl}}-foo.EraseRegions.after.mir
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:5) => validate_1[317d]::{{impl}}[0]::foo[0] }, BrAnon(0)) Test, _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:5) => validate_1[317d]::{{impl}}[0]::foo[0] }, BrAnon(1)) mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/0:5 ~ validate_1[317d]::{{impl}}[0]::foo[0]), BrAnon(0)) Test, _2: &ReFree(DefId(0/0:5 ~ validate_1[317d]::{{impl}}[0]::foo[0]), BrAnon(1)) mut i32]);
// ... // ...
// return; // return;
// } // }
@@ -62,7 +62,7 @@ fn main() {
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(50)], _2: &ReErased mut i32) -> i32 { // fn main::{{closure}}(_1: &ReErased [closure@NodeId(50)], _2: &ReErased mut i32) -> i32 {
// ... // ...
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:11) => validate_1[317d]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(50)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:11) => validate_1[317d]::main[0]::{{closure}}[0] }, BrAnon(0)) mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/1:11 ~ validate_1[317d]::main[0]::{{closure}}[0]), BrEnv) [closure@NodeId(50)], _2: &ReFree(DefId(0/1:11 ~ validate_1[317d]::main[0]::{{closure}}[0]), BrAnon(0)) mut i32]);
// StorageLive(_3); // StorageLive(_3);
// Validate(Suspend(ReScope(Remainder(BlockRemainder { block: ItemLocalId(22), first_statement_index: 0 }))), [(*_2): i32]); // Validate(Suspend(ReScope(Remainder(BlockRemainder { block: ItemLocalId(22), first_statement_index: 0 }))), [(*_2): i32]);
// _3 = &ReErased (*_2); // _3 = &ReErased (*_2);
+6 -6
View File
@@ -51,8 +51,8 @@ fn main() {
// fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () { // fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () {
// ... // ...
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[317d]::write_42[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(22)], _2: *mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/1:9 ~ validate_4[317d]::write_42[0]::{{closure}}[0]), BrEnv) [closure@NodeId(22)], _2: *mut i32]);
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[317d]::write_42[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(22)], _2: *mut i32]); // Validate(Release, [_1: &ReFree(DefId(0/1:9 ~ validate_4[317d]::write_42[0]::{{closure}}[0]), BrEnv) [closure@NodeId(22)], _2: *mut i32]);
// (*_2) = const 23i32; // (*_2) = const 23i32;
// return; // return;
// } // }
@@ -62,8 +62,8 @@ fn main() {
// fn test(_1: &ReErased mut i32) -> () { // fn test(_1: &ReErased mut i32) -> () {
// ... // ...
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:4) => validate_4[317d]::test[0] }, BrAnon(0)) mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/0:4 ~ validate_4[317d]::test[0]), BrAnon(0)) mut i32]);
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:4) => validate_4[317d]::test[0] }, BrAnon(0)) mut i32]); // Validate(Release, [_1: &ReFree(DefId(0/0:4 ~ validate_4[317d]::test[0]), BrAnon(0)) mut i32]);
// ... // ...
// _2 = const write_42(_3) -> bb1; // _2 = const write_42(_3) -> bb1;
// } // }
@@ -78,8 +78,8 @@ fn main() {
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool { // fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool {
// ... // ...
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrAnon(0)) mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/1:10 ~ validate_4[317d]::main[0]::{{closure}}[0]), BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId(0/1:10 ~ validate_4[317d]::main[0]::{{closure}}[0]), BrAnon(0)) mut i32]);
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrAnon(0)) mut i32]); // Validate(Release, [_1: &ReFree(DefId(0/1:10 ~ validate_4[317d]::main[0]::{{closure}}[0]), BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId(0/1:10 ~ validate_4[317d]::main[0]::{{closure}}[0]), BrAnon(0)) mut i32]);
// StorageLive(_3); // StorageLive(_3);
// ... // ...
// _0 = const write_42(_3) -> bb1; // _0 = const write_42(_3) -> bb1;
+2 -2
View File
@@ -37,7 +37,7 @@ fn main() {
// fn test(_1: &ReErased mut i32) -> () { // fn test(_1: &ReErased mut i32) -> () {
// ... // ...
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:4) => validate_5[317d]::test[0] }, BrAnon(0)) mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/0:4 ~ validate_5[317d]::test[0]), BrAnon(0)) mut i32]);
// ... // ...
// Validate(Release, [_2: bool, _3: *mut i32]); // Validate(Release, [_2: bool, _3: *mut i32]);
// _2 = const write_42(_3) -> bb1; // _2 = const write_42(_3) -> bb1;
@@ -49,7 +49,7 @@ fn main() {
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(46)], _2: &ReErased mut i32) -> bool { // fn main::{{closure}}(_1: &ReErased [closure@NodeId(46)], _2: &ReErased mut i32) -> bool {
// ... // ...
// bb0: { // bb0: {
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_5[317d]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(46)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_5[317d]::main[0]::{{closure}}[0] }, BrAnon(0)) mut i32]); // Validate(Acquire, [_1: &ReFree(DefId(0/1:9 ~ validate_5[317d]::main[0]::{{closure}}[0]), BrEnv) [closure@NodeId(46)], _2: &ReFree(DefId(0/1:9 ~ validate_5[317d]::main[0]::{{closure}}[0]), BrAnon(0)) mut i32]);
// StorageLive(_3); // StorageLive(_3);
// StorageLive(_4); // StorageLive(_4);
// Validate(Suspend(ReScope(Node(ItemLocalId(9)))), [(*_2): i32]); // Validate(Suspend(ReScope(Node(ItemLocalId(9)))), [(*_2): i32]);
+19
View File
@@ -0,0 +1,19 @@
// Copyright 2017 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.
#![feature(optin_builtin_traits)]
#![crate_name = "foo"]
pub struct Foo;
// @has foo/struct.Foo.html
// @has - '//*[@class="sidebar-title"][@href="#implementations"]' 'Trait Implementations'
// @has - '//*[@class="sidebar-links"]/a' '!Sync'
impl !Sync for Foo {}
@@ -87,5 +87,17 @@
"rendered": null "rendered": null
} }
], ],
"rendered": null "rendered": "warning: unnecessary parentheses around assigned value
--> $DIR/unused_parens_json_suggestion.rs:24:14
|
24 | let _a = (1 / (2 + 3));
| ^^^^^^^^^^^^^ help: remove these parentheses
|
note: lint level defined here
--> $DIR/unused_parens_json_suggestion.rs:19:9
|
19 | #![warn(unused_parens)]
| ^^^^^^^^^^^^^
"
} }
+123 -15
View File
@@ -2,7 +2,72 @@
"message": "cannot find type `Iter` in this scope", "message": "cannot find type `Iter` in this scope",
"code": { "code": {
"code": "E0412", "code": "E0412",
"explanation": "/nThe type name used is not in scope./n/nErroneous code examples:/n/n```compile_fail,E0412/nimpl Something {} // error: type name `Something` is not in scope/n/n// or:/n/ntrait Foo {/n fn bar(N); // error: type name `N` is not in scope/n}/n/n// or:/n/nfn foo(x: T) {} // type name `T` is not in scope/n```/n/nTo fix this error, please verify you didn't misspell the type name, you did/ndeclare it or imported it into the scope. Examples:/n/n```/nstruct Something;/n/nimpl Something {} // ok!/n/n// or:/n/ntrait Foo {/n type N;/n/n fn bar(_: Self::N); // ok!/n}/n/n// or:/n/nfn foo<T>(x: T) {} // ok!/n```/n/nAnother case that causes this error is when a type is imported into a parent/nmodule. To fix this, you can follow the suggestion and use File directly or/n`use super::File;` which will import the types from the parent namespace. An/nexample that causes this error is below:/n/n```compile_fail,E0412/nuse std::fs::File;/n/nmod foo {/n fn some_function(f: File) {}/n}/n```/n/n```/nuse std::fs::File;/n/nmod foo {/n // either/n use super::File;/n // or/n // use std::fs::File;/n fn foo(f: File) {}/n}/n# fn main() {} // don't insert it for us; that'll break imports/n```/n" "explanation": "
The type name used is not in scope.
Erroneous code examples:
```compile_fail,E0412
impl Something {} // error: type name `Something` is not in scope
// or:
trait Foo {
fn bar(N); // error: type name `N` is not in scope
}
// or:
fn foo(x: T) {} // type name `T` is not in scope
```
To fix this error, please verify you didn't misspell the type name, you did
declare it or imported it into the scope. Examples:
```
struct Something;
impl Something {} // ok!
// or:
trait Foo {
type N;
fn bar(_: Self::N); // ok!
}
// or:
fn foo<T>(x: T) {} // ok!
```
Another case that causes this error is when a type is imported into a parent
module. To fix this, you can follow the suggestion and use File directly or
`use super::File;` which will import the types from the parent namespace. An
example that causes this error is below:
```compile_fail,E0412
use std::fs::File;
mod foo {
fn some_function(f: File) {}
}
```
```
use std::fs::File;
mod foo {
// either
use super::File;
// or
// use std::fs::File;
fn foo(f: File) {}
}
# fn main() {} // don't insert it for us; that'll break imports
```
"
}, },
"level": "error", "level": "error",
"spans": [ "spans": [
@@ -50,7 +115,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::binary_heap::Iter;/n/n", "suggested_replacement": "use std::collections::binary_heap::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -70,7 +137,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::btree_map::Iter;/n/n", "suggested_replacement": "use std::collections::btree_map::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -90,7 +159,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::btree_set::Iter;/n/n", "suggested_replacement": "use std::collections::btree_set::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -110,7 +181,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::hash_map::Iter;/n/n", "suggested_replacement": "use std::collections::hash_map::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -130,7 +203,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::hash_set::Iter;/n/n", "suggested_replacement": "use std::collections::hash_set::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -150,7 +225,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::linked_list::Iter;/n/n", "suggested_replacement": "use std::collections::linked_list::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -170,7 +247,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::collections::vec_deque::Iter;/n/n", "suggested_replacement": "use std::collections::vec_deque::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -190,7 +269,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::option::Iter;/n/n", "suggested_replacement": "use std::option::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -210,7 +291,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::path::Iter;/n/n", "suggested_replacement": "use std::path::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -230,7 +313,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::result::Iter;/n/n", "suggested_replacement": "use std::result::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -250,7 +335,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::slice::Iter;/n/n", "suggested_replacement": "use std::slice::Iter;
",
"expansion": null "expansion": null
}, },
{ {
@@ -270,7 +357,9 @@
} }
], ],
"label": null, "label": null,
"suggested_replacement": "use std::sync::mpsc::Iter;/n/n", "suggested_replacement": "use std::sync::mpsc::Iter;
",
"expansion": null "expansion": null
} }
], ],
@@ -278,7 +367,24 @@
"rendered": null "rendered": null
} }
], ],
"rendered": null "rendered": "error[E0412]: cannot find type `Iter` in this scope
--> $DIR/use_suggestion_json.rs:20:12
|
20 | let x: Iter;
| ^^^^ not found in this scope
help: possible candidates are found in other modules, you can import them into scope
|
19 | use std::collections::binary_heap::Iter;
|
19 | use std::collections::btree_map::Iter;
|
19 | use std::collections::btree_set::Iter;
|
19 | use std::collections::hash_map::Iter;
|
and 8 other candidates
"
} }
{ {
"message": "aborting due to previous error", "message": "aborting due to previous error",
@@ -286,5 +392,7 @@
"level": "error", "level": "error",
"spans": [], "spans": [],
"children": [], "children": [],
"rendered": null "rendered": "error: aborting due to previous error
"
} }
+2 -2
View File
@@ -60,8 +60,8 @@ const TEST_REPOS: &'static [Test] = &[
}, },
Test { Test {
name: "servo", name: "servo",
repo: "https://github.com/eddyb/servo", repo: "https://github.com/servo/servo",
sha: "6031de9a397e2feba4ff98725991825f62b68518", sha: "17e97b9320fdb7cdb33bbc5f4d0fde0653bbf2e4",
lock: None, lock: None,
// Only test Stylo a.k.a. Quantum CSS, the parts of Servo going into Firefox. // Only test Stylo a.k.a. Quantum CSS, the parts of Servo going into Firefox.
// This takes much less time to build than all of Servo and supports stable Rust. // This takes much less time to build than all of Servo and supports stable Rust.
+14 -4
View File
@@ -2424,15 +2424,25 @@ actual:\n\
fn normalize_output(&self, output: &str, custom_rules: &[(String, String)]) -> String { fn normalize_output(&self, output: &str, custom_rules: &[(String, String)]) -> String {
let parent_dir = self.testpaths.file.parent().unwrap(); let parent_dir = self.testpaths.file.parent().unwrap();
let cflags = self.props.compile_flags.join(" "); let cflags = self.props.compile_flags.join(" ");
let parent_dir_str = if cflags.contains("--error-format json") let json = cflags.contains("--error-format json") ||
|| cflags.contains("--error-format pretty-json") { cflags.contains("--error-format pretty-json");
let parent_dir_str = if json {
parent_dir.display().to_string().replace("\\", "\\\\") parent_dir.display().to_string().replace("\\", "\\\\")
} else { } else {
parent_dir.display().to_string() parent_dir.display().to_string()
}; };
let mut normalized = output.replace(&parent_dir_str, "$DIR") let mut normalized = output.replace(&parent_dir_str, "$DIR");
.replace("\\\\", "\\") // denormalize for paths on windows
if json {
// escaped newlines in json strings should be readable
// in the stderr files. There's no point int being correct,
// since only humans process the stderr files.
// Thus we just turn escaped newlines back into newlines.
normalized = normalized.replace("\\n", "\n");
}
normalized = normalized.replace("\\\\", "\\") // denormalize for paths on windows
.replace("\\", "/") // normalize for paths on windows .replace("\\", "/") // normalize for paths on windows
.replace("\r\n", "\n") // normalize for linebreaks on windows .replace("\r\n", "\n") // normalize for linebreaks on windows
.replace("\t", "\\t"); // makes tabs visible .replace("\t", "\\t"); // makes tabs visible