Commit Graph

119725 Commits

Author SHA1 Message Date
bors
97f3eeec82 Auto merge of #55617 - oli-obk:stacker, r=nagisa,oli-obk
Prevent compiler stack overflow for deeply recursive code

I was unable to write a test that

1. runs in under 1s
2. overflows on my machine without this patch

The following reproduces the issue, but I don't think it's sensible to include a test that takes 30s to compile. We can now easily squash newly appearing overflows by the strategic insertion of calls to `ensure_sufficient_stack`.

```rust
// compile-pass

#![recursion_limit="1000000"]

macro_rules! chain {
    (EE $e:expr) => {$e.sin()};
    (RECURSE $i:ident $e:expr) => {chain!($i chain!($i chain!($i chain!($i $e))))};
    (Z $e:expr) => {chain!(RECURSE EE $e)};
    (Y $e:expr) => {chain!(RECURSE Z $e)};
    (X $e:expr) => {chain!(RECURSE Y $e)};
    (A $e:expr) => {chain!(RECURSE X $e)};
    (B $e:expr) => {chain!(RECURSE A $e)};
    (C $e:expr) => {chain!(RECURSE B $e)};
    // causes overflow on x86_64 linux
    // less than 1 second until overflow on test machine
    // after overflow has been fixed, takes 30s to compile :/
    (D $e:expr) => {chain!(RECURSE C $e)};
    (E $e:expr) => {chain!(RECURSE D $e)};
    (F $e:expr) => {chain!(RECURSE E $e)};
    // more than 10 seconds
    (G $e:expr) => {chain!(RECURSE F $e)};
    (H $e:expr) => {chain!(RECURSE G $e)};
    (I $e:expr) => {chain!(RECURSE H $e)};
    (J $e:expr) => {chain!(RECURSE I $e)};
    (K $e:expr) => {chain!(RECURSE J $e)};
    (L $e:expr) => {chain!(RECURSE L $e)};
}

fn main() {
    let x = chain!(D 42.0_f32);
}
```

fixes #55471
fixes #41884
fixes #40161
fixes #34844
fixes #32594

cc @alexcrichton @rust-lang/compiler

I looked at all code that checks the recursion limit and inserted stack growth calls where appropriate.
2020-05-07 00:03:23 +00:00
bors
29457dd92c Auto merge of #71958 - Dylan-DPC:rollup-woxwt5d, r=Dylan-DPC
Rollup of 5 pull requests

Successful merges:

 - #70908 (Provide suggestions for type parameters missing bounds for associated types)
 - #71731 (Turn off rustc-dev-guide toolstate for now)
 - #71888 (refactor suggest_traits_to_import)
 - #71918 (Rename methods section)
 - #71950 (Miri validation error handling cleanup)

Failed merges:

r? @ghost
2020-05-06 20:38:56 +00:00
Dylan DPC
066eb08f5d
Rollup merge of #71950 - RalfJung:try-validation-cleanup, r=oli-obk
Miri validation error handling cleanup

Slightly expand @jumbatm's pattern macro and use it throughout validation. This ensures we never incorrectly swallow `InvalidProgram` errors or ICE when they occur.

Fixes https://github.com/rust-lang/rust/issues/71353
r? @oli-obk
2020-05-06 22:36:55 +02:00
Dylan DPC
d33180e1d7
Rollup merge of #71918 - GuillaumeGomez:rename-methods-section, r=Dylan-DPC
Rename methods section

Fixes https://github.com/rust-lang/rust/issues/70475.

It renames the section [methods](https://doc.rust-lang.org/nightly/std/string/struct.String.html#methods) into "Implementations". However, I didn't not update the title in the sidebar considering that it only lists methods under (even though I updated the link of the "methods" to make it point to the "implementations" section.

r? @kinnison

cc @rust-lang/rustdoc
2020-05-06 22:36:51 +02:00
Dylan DPC
f7c3b0ce9a
Rollup merge of #71888 - lcnr:refactor-suggest_traits_to_import, r=estebank
refactor suggest_traits_to_import
2020-05-06 22:36:49 +02:00
Dylan DPC
7fc579ff5b
Rollup merge of #71731 - mark-i-m:guide-toolstate-off-for-now, r=kennytm
Turn off rustc-dev-guide toolstate for now

cc @rust-lang/wg-rustc-dev-guide @rust-lang/infra @ehuss

When we first added toolstate, the intent was to use toolstate to linkcheck PRs so that we would know which PRs break links in the guide (e.g. by moving some definition). However, these days, we are mostly getting 429 errors (too many requests) from github (not sure when this changed), and every day, there seems to be a spurious failure of some other sort. This is all despite efforts to filter out spurious failures.

Getting spurious gh pings is annoying, and we're not actually getting a lot out of this linkcheck beyond what we are getting with our CI on the guide's repo, so I'm proposing to disable this until we can figure out what might be a better path forward.
2020-05-06 22:36:45 +02:00
Dylan DPC
ce14d6db5a
Rollup merge of #70908 - estebank:suggest-add, r=nikomatsakis
Provide suggestions for type parameters missing bounds for associated types

When implementing the binary operator traits it is easy to forget to restrict the `Output` associated type. `rustc` now accounts for different cases to lead users in the right direction to add the necessary restrictions. The structured suggestions in the following output are new:

```
error: equality constraints are not yet supported in `where` clauses
  --> $DIR/missing-bounds.rs:37:33
   |
LL | impl<B: Add> Add for E<B> where <B as Add>::Output = B {
   |                                 ^^^^^^^^^^^^^^^^^^^^^^ not supported
   |
   = note: see issue #20041 <https://github.com/rust-lang/rust/issues/20041> for more information
help: if `Output` is an associated type you're trying to set, use the associated type binding syntax
   |
LL | impl<B: Add> Add for E<B> where B: Add<Output = B> {
   |                                 ^^^^^^^^^^^^^^^^^

error[E0308]: mismatched types
  --> $DIR/missing-bounds.rs:11:11
   |
7  | impl<B> Add for A<B> where B: Add {
   |      - this type parameter
...
11 |         A(self.0 + rhs.0)
   |           ^^^^^^^^^^^^^^ expected type parameter `B`, found associated type
   |
   = note: expected type parameter `B`
             found associated type `<B as std::ops::Add>::Output`
help: consider further restricting this bound
   |
7  | impl<B> Add for A<B> where B: Add + std::ops::Add<Output = B> {
   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0369]: cannot add `B` to `B`
  --> $DIR/missing-bounds.rs:31:21
   |
31 |         Self(self.0 + rhs.0)
   |              ------ ^ ----- B
   |              |
   |              B
   |
help: consider restricting type parameter `B`
   |
27 | impl<B: std::ops::Add<Output = B>> Add for D<B> {
   |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

That output is given for the following cases:

```rust
struct A<B>(B);
impl<B> Add for A<B> where B: Add {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        A(self.0 + rhs.0) //~ ERROR mismatched types
    }
}

struct D<B>(B);
impl<B> Add for D<B> {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        Self(self.0 + rhs.0) //~ ERROR cannot add `B` to `B`
    }
}

struct E<B>(B);
impl<B: Add> Add for E<B> where <B as Add>::Output = B {
    type Output = Self;

    fn add(self, rhs: Self) -> Self {
        Self(self.0 + rhs.0)
    }
}
```
2020-05-06 22:36:43 +02:00
bors
1836e3b42a Auto merge of #71951 - Dylan-DPC:rollup-j9v1p0f, r=Dylan-DPC
Rollup of 7 pull requests

Successful merges:

 - #71269 (Define UB in float-to-int casts to saturate)
 - #71591 (use new interface to create threads on HermitCore)
 - #71819 (x.py: Give a more helpful error message if curl isn't installed)
 - #71893 (Use the `impls` module to import pre-existing dataflow analyses)
 - #71929 (Use -fvisibility=hidden for libunwind)
 - #71937 (Ignore SGX on a few ui tests)
 - #71944 (Add comment for `Ord` implementation for array)

Failed merges:

r? @ghost
2020-05-06 16:59:45 +00:00
Dylan DPC
fbb4ccbee6
Rollup merge of #71944 - ldm0:arrordhint, r=sfackler
Add comment for `Ord` implementation for array

Corresponding to `Ord` implementation for slice. It hints new comer the rule of comparing two arrays.
2020-05-06 16:59:04 +02:00
Dylan DPC
4422cb73b6
Rollup merge of #71937 - mzohreva:mz/ui-tests-ignore-sgx, r=nikomatsakis
Ignore SGX on a few ui tests

cc @jethrogb
2020-05-06 16:59:02 +02:00
Dylan DPC
c366b27bfc
Rollup merge of #71929 - petrhosek:unwind-visibility, r=tmandry
Use -fvisibility=hidden for libunwind

We don't want to export any symbols from Rust's version of libunwind
as these may collide with other copies of libunwind e.g. when linking
Rust staticlib together C/C++ libraries that have their own version.
2020-05-06 16:59:00 +02:00
Dylan DPC
d30988e548
Rollup merge of #71893 - ecstatic-morse:dataflow-impls-import, r=jonas-schievink
Use the `impls` module to import pre-existing dataflow analyses

Currently, existing analyses live in the same module as the traits and types used to define new dataflow analyses. This muddles the [documentation for the `dataflow` module](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/index.html). After this PR, `dataflow::impls` will refer to concrete dataflow analyses, and `dataflow` to the generic interface.
2020-05-06 16:58:58 +02:00
Dylan DPC
538a353df0
Rollup merge of #71819 - jyn514:check-for-tools, r=Mark-Simulacrum
x.py: Give a more helpful error message if curl isn't installed

Before:

```
Updating only changed submodules
Submodules updated in 0.01 seconds
Traceback (most recent call last):
  File "./x.py", line 11, in <module>
    bootstrap.main()
  ...
  File "/home/joshua/src/rust/src/bootstrap/bootstrap.py", line 137, in run
    ret = subprocess.Popen(args, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
```

After:

```
Updating only changed submodules
Submodules updated in 0.01 seconds

spurious failure, trying again

spurious failure, trying again

spurious failure, trying again

spurious failure, trying again
failed to run: curl -s -y 30 -Y 10 --connect-timeout 30 --retry 3 -Sf -o /tmp/tmpSWF21P.sha256 https://static.rust-lang.org/dist/2020-04-22/rust-std-beta-x86_64-unknown-linux-gnu.tar.gz.sha256: [Errno 2] No such file or directory
Build completed unsuccessfully in 0:00:00
```
2020-05-06 16:58:57 +02:00
Dylan DPC
a6a7c755fa
Rollup merge of #71591 - hermitcore:thread_create, r=hanna-kruppe
use new interface to create threads on HermitCore

- the new interface allows to define the stack size
- increase the default stack size to 1 MByte
2020-05-06 16:58:53 +02:00
Dylan DPC
14d608f1d8
Rollup merge of #71269 - Mark-Simulacrum:sat-float-casts, r=nikic
Define UB in float-to-int casts to saturate

This closes #10184 by defining the behavior there to saturate infinities and values exceeding the integral range (on the lower or upper end). `NaN` is sent to zero.
2020-05-06 16:58:50 +02:00
Mark Rousskov
f63b8bffef Remove warning about UB 2020-05-06 08:14:21 -04:00
Mark Rousskov
d4f31b4687 Fixup tests to test both const-eval and runtime 2020-05-06 08:14:21 -04:00
Mark Rousskov
0dbce10bcd Pull in miri test cases 2020-05-06 08:14:21 -04:00
Mark Rousskov
9907ad6ed9 Define UB in float-to-int casts to saturate
- Round to zero, and representable values cast directly.
- `NaN` goes to 0
- Values beyond the limits of the type are saturated to the "nearest value"
  (essentially rounding to zero, in some sense) in the integral type, so e.g.
  `f32::INFINITY` would go to `{u,i}N::MAX.`
2020-05-06 08:14:21 -04:00
Ralf Jung
0e2a712743 more precise vtable errors 2020-05-06 13:46:01 +02:00
Ralf Jung
8998c7afe8 try_validation: handle multi-branching, and use macro for most remaining manual throw_validation_failure sites 2020-05-06 13:30:54 +02:00
bors
339f574809 Auto merge of #71949 - Dylan-DPC:rollup-0gg02wd, r=Dylan-DPC
Rollup of 6 pull requests

Successful merges:

 - #71510 (Btreemap iter intertwined)
 - #71727 (SipHasher with keys initialized to 0 should just use new())
 - #71889 (Explain our RwLock implementation)
 - #71905 (Add command aliases from Cargo to x.py commands)
 - #71914 (Backport 1.43.1 release notes to master)
 - #71921 (explain the types used in the open64 call)

Failed merges:

r? @ghost
2020-05-06 11:24:13 +00:00
Dylan DPC
b86620a558
Rollup merge of #71921 - RalfJung:open-mode, r=hanna-kruppe
explain the types used in the open64 call

Fixes https://github.com/rust-lang/rust/issues/71915, where I learned about this quirk. I don't actually know what I am talking about here. ;)
2020-05-06 13:22:22 +02:00
Dylan DPC
f29a92366e
Rollup merge of #71914 - pietroalbini:relnotes-1.43.1, r=Mark-Simulacrum
Backport 1.43.1 release notes to master

r? @Mark-Simulacrum
2020-05-06 13:22:21 +02:00
Dylan DPC
68130dd2ae
Rollup merge of #71905 - mibac138:x-cmd-alias, r=Mark-Simulacrum
Add command aliases from Cargo to x.py commands

Fixes #71357
2020-05-06 13:22:19 +02:00
Dylan DPC
e4bda619d5
Rollup merge of #71889 - RalfJung:rwlock, r=Amanieu
Explain our RwLock implementation

Turns out that [with the latest POSIX docs](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_wrlock.html), our `RwLock` implementation is actually correct. However, we cannot fully rely on that due to bugs in older glibc (fix released in 2016). Update the comments to explain that.

I also clarified our Mutex docs a bit and fixed another instance of https://github.com/rust-lang/rust/pull/55865.

r? @Amanieu
Fixes https://github.com/rust-lang/rust/issues/53127
2020-05-06 13:22:17 +02:00
Dylan DPC
3f56b84182
Rollup merge of #71727 - hbina:simplified_usage, r=Mark-Simulacrum
SipHasher with keys initialized to 0 should just use new()

I believe that is what the `new()` is for, for good reasons.
2020-05-06 13:22:13 +02:00
Dylan DPC
78a25cb10e
Rollup merge of #71510 - ssomers:btreemap_iter_intertwined, r=Mark-Simulacrum
Btreemap iter intertwined

3 commits:

1. Introduced benchmarks for `BTreeMap::iter()`. Benchmarks named `iter_20` were of the whole iteration process, so I renamed them. Also the benchmarks of `range` that I wrote earlier weren't very good. I included an (awkwardly named) one that compares `iter()` to `range(..)` on the same set, because the contrast is surprising:
```
 name                                           ns/iter
 btree::map::range_unbounded_unbounded          28,176
 btree::map::range_unbounded_vs_iter            89,369
```
Both dig up the same pair of leaf edges. `range(..)` also checks that some keys are correctly ordered, the only thing `iter()` does more is to copy the map's length.

2. Slightly refactoring the code to what I find more readable (not in chronological order of discovery), boosts performance:
```
>cargo-benchcmp.exe benchcmp a1 a2 --threshold 5
 name                                   a1 ns/iter  a2 ns/iter  diff ns/iter   diff %  speedup
 btree::map::find_rand_100              18          17                    -1   -5.56%   x 1.06
 btree::map::first_and_last_10k         64          71                     7   10.94%   x 0.90
 btree::map::iter_0                     2,939       2,209               -730  -24.84%   x 1.33
 btree::map::iter_1                     6,845       2,696             -4,149  -60.61%   x 2.54
 btree::map::iter_100                   8,556       3,672             -4,884  -57.08%   x 2.33
 btree::map::iter_10k                   9,292       5,884             -3,408  -36.68%   x 1.58
 btree::map::iter_1m                    10,268      6,510             -3,758  -36.60%   x 1.58
 btree::map::iteration_mut_100000       478,575     453,050          -25,525   -5.33%   x 1.06
 btree::map::range_unbounded_unbounded  28,176      36,169             7,993   28.37%   x 0.78
 btree::map::range_unbounded_vs_iter    89,369      38,290           -51,079  -57.16%   x 2.33
 btree::set::clone_100_and_remove_all   4,801       4,245               -556  -11.58%   x 1.13
 btree::set::clone_10k_and_remove_all   529,450     496,030          -33,420   -6.31%   x 1.07
```
But you can tell from the `range_unbounded_*` lines that, despite an unwarranted, vengeful attack on the range_unbounded_unbounded benchmark, this change still doesn't allow `iter()` to catch up with `range(..)`.

3. I guess that `range(..)` copes so well because it intertwines the leftmost and rightmost descend towards leaf edges, doing the two root node accesses close together, perhaps exploiting a CPU's internal pipelining? So the third commit distils a version of `range_search` (which we can't use directly because of the `Ord` bound), and we get another boost:
```
cargo-benchcmp.exe benchcmp a2 a3 --threshold 5
 name                                   a2 ns/iter  a3 ns/iter  diff ns/iter   diff %  speedup
 btree::map::first_and_last_100         40          43                     3    7.50%   x 0.93
 btree::map::first_and_last_10k         71          64                    -7   -9.86%   x 1.11
 btree::map::iter_0                     2,209       1,719               -490  -22.18%   x 1.29
 btree::map::iter_1                     2,696       2,205               -491  -18.21%   x 1.22
 btree::map::iter_100                   3,672       2,943               -729  -19.85%   x 1.25
 btree::map::iter_10k                   5,884       3,929             -1,955  -33.23%   x 1.50
 btree::map::iter_1m                    6,510       5,532               -978  -15.02%   x 1.18
 btree::map::iteration_mut_100000       453,050     476,667           23,617    5.21%   x 0.95
 btree::map::range_included_excluded    405,075     371,297          -33,778   -8.34%   x 1.09
 btree::map::range_included_included    427,577     397,440          -30,137   -7.05%   x 1.08
 btree::map::range_unbounded_unbounded  36,169      28,175            -7,994  -22.10%   x 1.28
 btree::map::range_unbounded_vs_iter    38,290      30,838            -7,452  -19.46%   x 1.24
```
But I think this is just fake news from the microbenchmarking media. `iter()` is still trying to catch up with `range(..)`. And we can sure do without another function. So I would skip this 3rd commit.

r? @Mark-Simulacrum
2020-05-06 13:22:05 +02:00
Ralf Jung
7c4422654a convert throw_validation_failure macro to same syntax as try_validation 2020-05-06 11:55:31 +02:00
Mateusz Mikuła
935a05f1be Update stacker and psm to 0.1.8 2020-05-06 11:37:18 +02:00
Ralf Jung
441419a923 properly catch invalid-drop-fn errors 2020-05-06 11:31:05 +02:00
Donough Liu
5087c1ad2b Add comment for Ord implementation for array 2020-05-06 17:02:53 +08:00
Guillaume Gomez
a64d643956 Update librustdoc ID tests 2020-05-06 09:59:47 +02:00
Ralf Jung
19bd72e623 convert remaining try_validation to new macro 2020-05-06 09:22:52 +02:00
bors
8da5869fb7 Auto merge of #69464 - Marwes:detach_undo_log, r=nikomatsakis
perf: Unify the undo log of all snapshot types

Extracted from #69218 and extended to all the current snapshot types.

Since snapshotting is such a frequent action in the compiler and many of the scopes execute so little work, the act of creating the snapshot and rolling back empty/small snapshots end up showing in perf. By unifying all the logs into one the creation of snapshots becomes significantly cheaper at the cost of some complexity when combining the log with the specific data structures that are being mutated.

Depends on https://github.com/rust-lang-nursery/ena/pull/29
2020-05-06 07:03:31 +00:00
mark
837c16ba2a comment out rustc-dev-guide in NIGHTLY_TOOLS 2020-05-05 21:46:12 -05:00
Mohsen Zohrevandi
7db74beaec Ignore SGX on a few ui tests 2020-05-05 19:19:39 -07:00
bors
43271a39ad Auto merge of #71875 - Xanewok:update-rls, r=tmandry
Update RLS

In addition to fixing the toolstate, this also changes the default
compilation model to the out-of-process one, which should hopefully
target considerable memory usage for long-running instances of the RLS.

Fixes #71753

r? @ghost
2020-05-05 23:52:56 +00:00
Ralf Jung
aa2eaca443 add test for insufficiently aligned vtable 2020-05-06 00:13:41 +02:00
Ralf Jung
e0320b5f58 validation: port more checks to the pattern-based macro (and give it the shorter name) 2020-05-06 00:13:20 +02:00
Guillaume Gomez
758519c5f0 Index IDs already used by rustdoc template 2020-05-05 23:44:10 +02:00
Guillaume Gomez
4ade6eb2a2 Add test for new implementations section title 2020-05-05 22:56:23 +02:00
Guillaume Gomez
cf184823d1 Update tests 2020-05-05 22:56:23 +02:00
Guillaume Gomez
e17f36b82e Replace title "Methods" with "Implementations" 2020-05-05 22:56:23 +02:00
Tyler Mandry
3b8358e682 Unify winapi features for tools 2020-05-05 12:50:58 -07:00
Petr Hosek
32d1a4b025 Use -fvisibility=hidden for libunwind
We don't want to export any symbols from Rust's version of libunwind
as these may collide with other copies of libunwind e.g. when linking
Rust staticlib together C/C++ libraries that have their own version.
2020-05-05 12:41:23 -07:00
Ralf Jung
fbf791bd52 explain the types used in the open64 call 2020-05-05 17:08:22 +02:00
Igor Matuszewski
b512b1c7af Unify some syn 1.0 et al. features for tools 2020-05-05 15:29:15 +02:00
Igor Matuszewski
1dd0e3c38f Update RLS
In addition to fixing the toolstate, this also changes the default
compilation model to the out-of-process one, which should hopefully
target considerable memory usage for long-running instances of the RLS.
2020-05-05 14:16:26 +02:00
bors
f8d394e518 Auto merge of #71916 - Dylan-DPC:rollup-luj7zx3, r=Dylan-DPC
Rollup of 4 pull requests

Successful merges:

 - #69984 (Add Option to Force Unwind Tables)
 - #71830 (Remove clippy from some leftover lists of "possibly failing" tools)
 - #71894 (Suggest removing semicolon in last expression only if it's type is known)
 - #71897 (Improve docs for embed-bitcode and linker-plugin-lto)

Failed merges:

r? @ghost
2020-05-05 11:05:18 +00:00