bors [Wed, 13 Nov 2019 23:22:03 +0000 (23:22 +0000)]
Auto merge of #66211 - kinnison:kinnison/fix-66159, r=GuillaumeGomez
Fix ICE when documentation includes intra-doc-link
When collecting intra-doc-links we could trigger the loading of extra crates into the crate store due to name resolution finding crates referred to in documentation but not in code. This might be due to
configuration differences or simply referring to something else.
This would cause an ICE because the newly loaded crate metadata existed in a crate store associated with the rustdoc global context, but the resolver had its own crate store cloned just before the documentation processing began and as such it could try and look up crates in a store which lacked them.
In this PR, I add support for `--extern-private` to the `rustdoc` tool so that it is supported for `compiletest` to then pass the crates in; and then I fix the issue by forcing the resolver to look over all the crates before we then lower the input ready for processing into documentation.
The first commit (the `--extern-private`) could be replaced with a commit which adds support for `--extern` to `compiletest` if preferred, though I think that adding `--extern-private` to `rustdoc` is more useful anyway since it makes the CLI a little more like `rustc`'s which might help reduce surprise for someone running it by hand or in their own test code.
The PR is meant to fix #66159 though it may also fix #65840.
bors [Wed, 13 Nov 2019 20:10:54 +0000 (20:10 +0000)]
Auto merge of #66170 - ecstatic-morse:hir-const-check, r=Centril,oli-obk
Add a HIR pass to check consts for `if`, `loop`, etc.
Resolves #66125.
This PR adds a HIR pass to check for high-level control flow constructs that are forbidden in a const-context. The MIR const-checker is unable to provide good spans for these since they are lowered to control flow primitives (e.g., `Goto` and `SwitchInt`), and these often don't map back to the underlying statement as a whole. This PR is intended only to improve diagnostics once `if` and `match` become commonplace in constants (behind a feature flag). The MIR const-checker will continue to operate unchanged, and will catch anything this check might miss.
In this implementation, the HIR const-checking pass is run much earlier than the MIR one, so it will supersede any errors from the latter. I will need some mentoring if we wish to change this, since I'm not familiar with the diagnostics system. Moving this pass into the same phase as the MIR const-checker could also help keep backwards compatibility for items like `const _: () = loop { break; };`, which are currently (erroneously?) accepted by the MIR const-checker (see #62272).
Dylan MacKenzie [Thu, 7 Nov 2019 01:45:10 +0000 (17:45 -0800)]
Bless back-compat breakages
This PR BREAKS CODE THAT WAS ACCEPTED ON STABLE. It's arguably a bug
that this was accepted in the first place, but here we are. See #62272
for more info.
Dylan MacKenzie [Wed, 6 Nov 2019 20:24:23 +0000 (12:24 -0800)]
Remove if/loop tests from min_const_fn
These errors will be triggered before the MIR const-checker runs,
causing all other errors to be silenced. They are now checked in the
`const-{if,loop}` tests.
Dylan MacKenzie [Wed, 6 Nov 2019 19:44:56 +0000 (11:44 -0800)]
Add HIR pass to check for `if`s and `loop`s in a `const`
These high-level constructs get mapped to control-flow primitives by the
time the MIR const-checker runs, making it hard to get the span for the
erroneous expression.
bors [Wed, 13 Nov 2019 13:16:53 +0000 (13:16 +0000)]
Auto merge of #66366 - JohnTitor:rollup-xlc1bj2, r=JohnTitor
Rollup of 14 pull requests
Successful merges:
- #65932 (download .tar.xz if python3 is used)
- #66094 (Fix documentation for `Iterator::count()`.)
- #66166 (rename cfg(rustdoc) into cfg(doc))
- #66186 (Add long error explanation for E0623)
- #66227 (docs: Fix link to BufWriter::flush)
- #66248 (add raw ptr variant of UnsafeCell::get)
- #66292 (add Result::map_or)
- #66297 (Add a callback that allows compiler consumers to override queries.)
- #66317 (Use a relative bindir for rustdoc to find rustc)
- #66330 (Improve non-exhaustiveness handling in usefulness checking)
- #66331 (Add some tests for fixed ICEs)
- #66334 (Move Session fields to CrateStore)
- #66335 (Move self-profile infrastructure to data structures)
- #66337 (Remove dead code for encoding/decoding lint IDs)
Yuki Okushi [Wed, 13 Nov 2019 13:09:29 +0000 (22:09 +0900)]
Rollup merge of #66335 - Mark-Simulacrum:self-profile-to-data, r=michaelwoerister
Move self-profile infrastructure to data structures
The single dependency on queries (QueryName) can be fairly easily
abstracted via a trait and this further decouples Session from librustc
(the primary goal).
This is intended as a precursor to moving Session out of librustc, but since that involves lots of smaller steps that move around code I'm splitting it up into separate PRs.
Yuki Okushi [Wed, 13 Nov 2019 13:09:28 +0000 (22:09 +0900)]
Rollup merge of #66334 - Mark-Simulacrum:sess-cstore, r=petrochenkov
Move Session fields to CrateStore
`allocator_kind` and `injected_panic_runtime` are both query-like, this moves them out of Session and into CrateStore, avoiding the `Once` they previously had by clearing separating initialization and de-initialization.
Yuki Okushi [Wed, 13 Nov 2019 13:09:26 +0000 (22:09 +0900)]
Rollup merge of #66331 - JohnTitor:add-tests, r=Centril
Add some tests for fixed ICEs
Closes #30904 (fixed between nightly-2019-07-14 and nightly-2019-07-31)
Closes #40231 (example 1 is fixed in 1.32.0, example 2 is fixed in 1.38.0)
Closes #52432 (fixed in rustc 1.40.0-beta.1 (76b40532a 2019-11-05))
Closes #63279 (fixed in rustc 1.40.0-nightly (246be7e1a 2019-10-25))
Yuki Okushi [Wed, 13 Nov 2019 13:09:25 +0000 (22:09 +0900)]
Rollup merge of #66330 - Nadrieril:nonexhaustive-constructor, r=varkor
Improve non-exhaustiveness handling in usefulness checking
The comments around code paths for the `non_exhaustive` feature mention stuff like "we act as if the type had an extra unmatcheable constructor". So I thought I'd make this explicit by defining a special constructor that does exactly this.
This makes those code paths a bit more legible and less prone to error.
Yuki Okushi [Wed, 13 Nov 2019 13:09:23 +0000 (22:09 +0900)]
Rollup merge of #66317 - cuviper:bindir_relative, r=Mark-Simulacrum
Use a relative bindir for rustdoc to find rustc
In bootstrap, we set `RUSTC_INSTALL_BINDIR` to `config.bindir`, so
rustdoc can find rustc relative to the toolchain sysroot. However, if a
distro script like Fedora's `%configure` sets an absolute path, then
rustdoc's `sysroot.join(bin_path)` ignores that sysroot altogether.
That would be OK once the toolchain is actually installed, but it breaks
the in-tree doc tests during the build, since `/usr/bin/rustc` is still
the old version. So now we try to make `RUSTC_INSTALL_BINDIR` relative
to the sysroot prefix in the first place.
Yuki Okushi [Wed, 13 Nov 2019 13:09:22 +0000 (22:09 +0900)]
Rollup merge of #66297 - vakaras:edit-queries, r=oli-obk
Add a callback that allows compiler consumers to override queries.
This pull request adds an additional callback that allows compiler consumers such as Prusti and MIRAI to override queries. My hope is that in this way it will be possible to get access to the internal compiler information (e.g. borrow checker) without major changes to the compiler.
This pull request is work in progress because I am still testing if I can get the information which I need.
Yuki Okushi [Wed, 13 Nov 2019 13:09:19 +0000 (22:09 +0900)]
Rollup merge of #66248 - RalfJung:unsafe_cell_raw_get, r=SimonSapin
add raw ptr variant of UnsafeCell::get
This has come up recently in https://github.com/rust-lang/rust/pull/66051 (Cc @Centril @pitdicker) as well as in discussion with @nikomatsakis and in unrelated discussion with @withoutboats.
Yuki Okushi [Wed, 13 Nov 2019 13:09:17 +0000 (22:09 +0900)]
Rollup merge of #66227 - bryanburgers:bufwriter-docs-fix-flush-link, r=Dylan-DPC
docs: Fix link to BufWriter::flush
One of the links in the docs was being rendered as a literal
open-bracket followed by a single quote, instead of being transformed
into a link. Fix it to match the link earlier in the same paragraph.
Yuki Okushi [Wed, 13 Nov 2019 13:09:11 +0000 (22:09 +0900)]
Rollup merge of #66094 - ArturKovacs:fix-count-doc, r=Dylan-DPC
Fix documentation for `Iterator::count()`.
The documentation of std::core::Iterator::count() stated that the number returned is the number of times `next` is called on the iterator. However this is not true as the number of times `next` is called is exactly one plus the number returned by `count()`.
bors [Wed, 13 Nov 2019 03:48:42 +0000 (03:48 +0000)]
Auto merge of #65637 - ssomers:master, r=scottmcm
proposal for BTreeMap/Set min/max, #62924
- Which pair of names: #62924 lists the existing possibilities min/max, first/last, (EDIT) front/back, peek(/peek_back?). Iterators have next/next_back or next/last. I'm slightly in favour of first/last because min/max might suggest they search over the entire map, and front/back pretends they are only about position.
- Return key only instead of pair like iterator does?
- If not, then keep the _key_value suffix? ~~Also provide variant with mutable value? But there is no such variant for get_key_value.~~
- Look for and upgrade more usages of `.iter().next()` and such in the libraries? I only upgraded the ones I contributed myself, all very recently.
bors [Tue, 12 Nov 2019 18:02:54 +0000 (18:02 +0000)]
Auto merge of #65608 - matthewjasper:mir-eval-order, r=pnkfelix
Fix MIR lowering evaluation order and soundness bug
* Fixes a soundness issue with built-in index operations
* Ensures correct evaluation order of assignment expressions where the RHS is a FRU or is a use of a local of reference type.
* Removes an unnecessary symbol to string conversion
Mark Rousskov [Mon, 11 Nov 2019 22:15:36 +0000 (17:15 -0500)]
Move self-profile infrastructure to data structures
The single dependency on queries (QueryName) can be fairly easily
abstracted via a trait and this further decouples Session from librustc
(the primary goal).
Yuki Okushi [Tue, 12 Nov 2019 07:36:16 +0000 (16:36 +0900)]
Rollup merge of #66299 - rossmacarthur:fix-41260-avoid-issue-0, r=varkor
support issue = "none" in unstable attributes
This works towards fixing #41260.
This PR allows the use of `issue = "none"` in unstable attributes and makes changes to internally store the issue number as an `Option<NonZeroU32>`. For example:
It was not made optional because feedback seen here #60860 suggested that people might forget the issue field if it was optional.
I could not remove the current uses of `issue = "0"` (of which there are a lot) because the stage 0 compiler expects the old syntax. Once this is available in the stage 0 compiler we can replace all uses of `"0"` with `"none"` and no longer allow `"0"`. This is my first time contributing, so I'm not sure what the protocol is with two-part things like this, so some guidance would be appreciated.
Yuki Okushi [Tue, 12 Nov 2019 07:36:15 +0000 (16:36 +0900)]
Rollup merge of #66280 - stepancheg:union, r=alexcrichton
Fix HashSet::union performance
Consider this example: small_set = 0..2, large_set = 0..1000.
To efficiently compute the union of these sets, we should
* take all elements of the larger set
* for each element of the smaller set check it is not in the larger set
This is exactly what this commit does.
This particular optimization was implemented a year ago, but the
author mistaken `<` and `>`.
Yuki Okushi [Tue, 12 Nov 2019 07:36:07 +0000 (16:36 +0900)]
Rollup merge of #66257 - mati865:long-section-names-no-more, r=alexcrichton
Drop long-section-names linker workaround for windows-gnu
If we can trust objdump Rust doesn't emit sections loaded at runtime longer than 8 characters on windows-gnu (but still does on linux-gnu), debug sections are not affected by that limit.
I've ran tests and built few crates using exactly the same mingw-w64 version as Rusts CI just fine using **x86_64** toolchain.
The motivation for this change is making LLD work (it doesn't support `--enable-long-section-names`) with this target without hacks.
Bit of history:
The behaviour of LD changed in Binutils 2.20 released on 2009-10-16 and `--enable-long-section-names` was added to return to the old non conformant behaviour. Looking at the comment I can only guess there was a bug fixed in newer versions.
This workaround was added in https://github.com/rust-lang/rust/pull/13315 half a decade ago.
bors [Tue, 12 Nov 2019 04:44:30 +0000 (04:44 +0000)]
Auto merge of #66129 - Nadrieril:refactor-slice-pat-usefulness, r=varkor
Refactor slice pattern usefulness checking
As a follow up to https://github.com/rust-lang/rust/pull/65874, this PR changes how variable-length slice patterns are handled in usefulness checking. The objectives are: cleaning up that code to make it easier to understand, and paving the way to handling fixed-length slices more cleverly too, for https://github.com/rust-lang/rust/issues/53820.
Before this, variable-length slice patterns were eagerly expanded into a union of fixed-length slices. Now they have their own special constructor, which allows expanding them a bit more lazily.
As a nice side-effect, this improves diagnostics.
This PR shows a slight performance improvement, mostly due to https://github.com/rust-lang/rust/pull/66129/commits/149792b6080f40875c0072aae378a0eb31d23df0. This will probably have to be reverted in some way when we implement or-patterns.
Josh Stone [Mon, 11 Nov 2019 22:22:23 +0000 (14:22 -0800)]
Use a relative bindir for rustdoc to find rustc
In bootstrap, we set `RUSTC_INSTALL_BINDIR` to `config.bindir`, so
rustdoc can find rustc relative to the toolchain sysroot. However, if a
distro script like Fedora's `%configure` sets an absolute path, then
rustdoc's `sysroot.join(bin_path)` ignores that sysroot altogether.
That would be OK once the toolchain is actually installed, but it breaks
the in-tree doc tests during the build, since `/usr/bin/rustc` is still
the old version. So now we try to make `RUSTC_INSTALL_BINDIR` relative
to the sysroot prefix in the first place.
Matthew Jasper [Sat, 19 Oct 2019 20:00:21 +0000 (21:00 +0100)]
Fix soundness issue with index bounds checks
An expression like `x[1][{ x = y; 2}]` would perform the bounds check
for the inner index operation before evaluating the outer index. This
would allow out of bounds memory accesses.