Commit Graph

122240 Commits

Author SHA1 Message Date
Jack Huey
90e01ee208 Update Chalk 2020-06-19 14:05:14 -04:00
Jack Huey
e997375934 Test error order is non-deterministic 2020-06-19 14:05:14 -04:00
Jack Huey
d0ad15d8cf Remove RustDefId 2020-06-19 14:05:14 -04:00
Jack Huey
a42e5a14c4 Implement fn_def_datum 2020-06-19 14:05:14 -04:00
Jack Huey
7c09ad0627 Use builtin types for Never, Array, and FnDef 2020-06-19 14:04:30 -04:00
Jack Huey
6aa2e9d978 Update chalk 2020-06-19 14:04:30 -04:00
Jack Huey
16dd584e11 Update chalk 2020-06-19 14:04:30 -04:00
Jack Huey
006b482794 Add compare-mode=chalk and add a little bit more implementations and fixmes 2020-06-19 14:04:30 -04:00
Christian Poveda
1f48465a01
update diagnostics for &mut in constants 2020-06-19 11:48:46 -05:00
Christian Poveda
014e605870
update tests 2020-06-19 11:48:46 -05:00
Christian Poveda
2f9d33830c
forbid mutable references in all constants except const fns 2020-06-19 11:48:46 -05:00
Raoul Strackx
33b304c5e0 Using xsave restore to restore complete FPU state 2020-06-19 18:39:07 +02:00
Manish Goregaokar
a88182f94b
Rollup merge of #73489 - sexxi-goose:init_place_refactor, r=nikomatsakis
Refactor hir::Place

For the following code
```rust
let c = || bar(foo.x, foo.x)
```

We generate two different `hir::Place`s for both `foo.x`.
Handling this adds overhead for analysis we need to do for RFC 2229.

We also want to store type information at each Projection to support
analysis as part of the RFC. This resembles what we have for
`mir::Place`

This commit modifies the Place as follows:
- Rename to `PlaceWithHirId`, where there `hir_id` is that of the
expressioin.
- Move any other information that describes the access out to another
struct now called `Place`.
- Removed `Span`, it can be accessed using the [hir
API](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html#method.span)
- Modify `Projection` to be a strucutre of its own, that currently only
contains the `ProjectionKind`.

Adding type information to projections wil be completed as part of https://github.com/rust-lang/project-rfc-2229/issues/5

Closes https://github.com/rust-lang/project-rfc-2229/issues/3
2020-06-19 09:15:20 -07:00
Manish Goregaokar
d2272d4f60
Rollup merge of #73465 - lzutao:spec-char-tostring, r=sfackler
Add specialization of `ToString for char`

Closes #73462
2020-06-19 09:15:18 -07:00
Manish Goregaokar
b443a107f8
Rollup merge of #73382 - Aaron1011:fix/self-receiver-candidates, r=petrochenkov
Only display other method receiver candidates if they actually apply

Previously, we would suggest `Box<Self>` as a valid receiver, even if
method resolution only succeeded due to an autoderef (e.g. to `&self`)
2020-06-19 09:15:16 -07:00
Manish Goregaokar
687f929c9b
Rollup merge of #73364 - joshtriplett:inline-asm, r=Amanieu
asm: Allow multiple template string arguments; interpret them as newline-separated

Allow the `asm!` macro to accept a series of template arguments, and interpret them as if they were concatenated with a '\n' between them. This allows writing an `asm!` where each line of assembly appears in a separate template string argument.

This syntax makes it possible for rustfmt to reliably format and indent each line of assembly, without risking changes to the inside of a template string. It also avoids the complexity of having the user carefully format and indent a multi-line string (including where to put the surrounding quotes), and avoids the extra indentation and lines of a call to `concat!`.

For example, rewriting the second example from the [blog post on the new inline assembly syntax](https://blog.rust-lang.org/inside-rust/2020/06/08/new-inline-asm.html) using multiple template strings:

```rust

fn main() {
    let mut bits = [0u8; 64];
    for value in 0..=1024u64 {
        let popcnt;
        unsafe {
            asm!(
                "    popcnt {popcnt}, {v}",
                "2:",
                "    blsi rax, {v}",
                "    jz 1f",
                "    xor {v}, rax",
                "    tzcnt rax, rax",
                "    stosb",
                "    jmp 2b",
                "1:",
                v = inout(reg) value => _,
                popcnt = out(reg) popcnt,
                out("rax") _, // scratch
                inout("rdi") bits.as_mut_ptr() => _,
            );
        }
        println!("bits of {}: {:?}", value, &bits[0..popcnt]);
    }
}
```

Note that all the template strings must appear before all other arguments; you cannot, for instance, provide a series of template strings intermixed with the corresponding operands.
2020-06-19 09:15:14 -07:00
Manish Goregaokar
65c33ed798
Rollup merge of #73357 - petrochenkov:tmap, r=davidtwco
Use `LocalDefId` for import IDs in trait map

cc https://github.com/rust-lang/rust/pull/73291#discussion_r439734867
2020-06-19 09:15:12 -07:00
Manish Goregaokar
b285d68f36
Rollup merge of #73334 - ayazhafiz:err/num-type-cannot-fit, r=estebank
Note numeric literals that can never fit in an expected type

re https://github.com/rust-lang/rust/pull/72380#discussion_r438289385

Given the toy code

```rust
fn is_positive(n: usize) {
  n > -1_isize;
}
```

We currently get a type mismatch error like the following:

```
error[E0308]: mismatched types
 --> src/main.rs:2:9
  |
2 |     n > -1_isize;
  |         ^^^^^^^^ expected `usize`, found `isize`
  |
help: you can convert an `isize` to `usize` and panic if the converted value wouldn't fit
  |
2 |     n > (-1_isize).try_into().unwrap();
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

But clearly, `-1` can never fit into a `usize`, so the suggestion will
always panic. A more useful message would tell the user that the value
can never fit in the expected type:

```
error[E0308]: mismatched types
 --> test.rs:2:9
  |
2 |     n > -1_isize;
  |         ^^^^^^^^ expected `usize`, found `isize`
  |
note: `-1_isize` can never fit into `usize`
 --> test.rs:2:9
  |
2 |     n > -1_isize;
  |         ^^^^^^^^
```

Which is what this commit implements.

I only added this check for negative literals because

- Currently we can only perform such a check for literals (constant
  value propagation is outside the scope of the typechecker at this
  point)
- A lint error for out-of-range numeric literals is already emitted

IMO it makes more sense to put this check in librustc_lint, but as far
as I can tell the typecheck pass happens before the lint pass, so I've
added it here.

r? @estebank
2020-06-19 09:15:10 -07:00
Manish Goregaokar
058971cef3
Rollup merge of #73300 - crlf0710:crate_level_only_check, r=petrochenkov
Implement crate-level-only lints checking.

This implements a crate_level_only flag on lints, and when it is true, it becomes an error when user tries  to specify this flag upon nodes other than crate node.

This also turns on this flag for all non_ascii_ident lints.
2020-06-19 09:15:08 -07:00
Manish Goregaokar
4910206b4a
Rollup merge of #73261 - estebank:generics-sized, r=nikomatsakis
Suggest `?Sized` when applicable for ADTs

Address #71790, fix #27964.
2020-06-19 09:15:06 -07:00
Manish Goregaokar
17064dae1a
Rollup merge of #73257 - davidtwco:issue-73249-improper-ctypes-projection, r=lcnr,varkor
ty: projections in `transparent_newtype_field`

Fixes #73249.

This PR modifies `transparent_newtype_field` so that it handles
projections with generic parameters, where `normalize_erasing_regions`
would ICE.
2020-06-19 09:15:04 -07:00
Manish Goregaokar
186640a158
Rollup merge of #73248 - marmeladema:save-analysis-various-fixes, r=Xanewok
save_analysis: improve handling of enum struct variant

Fixes #61385
2020-06-19 09:15:02 -07:00
Manish Goregaokar
bc773fe568
Rollup merge of #73214 - androm3da:hex_inline_asm_00, r=Amanieu
Add asm!() support for hexagon
2020-06-19 09:15:00 -07:00
Manish Goregaokar
55479de299
Rollup merge of #72709 - LeSeulArtichaut:unsafe-liballoc, r=nikomatsakis
`#[deny(unsafe_op_in_unsafe_fn)]` in liballoc

This PR proposes to make use of the new `unsafe_op_in_unsafe_fn` lint, i.e. no longer consider the body of an unsafe function as an unsafe block and require explicit unsafe block to perform unsafe operations.

This has been first (partly) suggested by @Mark-Simulacrum in https://github.com/rust-lang/rust/pull/69245#issuecomment-587817065

Tracking issue for the feature: #71668.
~~Blocked on #71862.~~
r? @Mark-Simulacrum cc @nikomatsakis can you confirm that those changes are desirable? Should I restrict it to only BTree for the moment?
2020-06-19 09:14:58 -07:00
Manish Goregaokar
85e1c3baca
Rollup merge of #71568 - hbina:document_unsafety_slice_sort, r=joshtriplett
Document unsafety in slice/sort.rs

Let me know if these documentations are accurate c:

I don't think I am capable enough to document the safety of `partition_blocks`, however.

Related issue #66219
2020-06-19 09:14:56 -07:00
Nathan West
0094f44a0b Remove old commented code 2020-06-19 11:42:58 -04:00
Nathan West
e93362b974 Fixed missing mut 2020-06-19 11:32:36 -04:00
David Wood
6fa7dc6527
pretty/mir: const value enums with no variants
This commit modifies the pretty printer and const eval in the MIR so
that `destructure_const` (used in `pretty_print_const_value`) can handle
enums with no variants (or types containing enums with no variants).

Signed-off-by: David Wood <david@davidtw.co>
2020-06-19 14:46:01 +01:00
Igor Matuszewski
f4b2a205ad Bump Rustfmt and RLS 2020-06-19 15:38:14 +02:00
bors
72417d84fb Auto merge of #73504 - RalfJung:rollup-iy8hsvl, r=RalfJung
Rollup of 10 pull requests

Successful merges:

 - #72280 (Fix up autoderef when reborrowing)
 - #72785 (linker: MSVC supports linking static libraries as a whole archive)
 - #73011 (first stage of implementing LLVM code coverage)
 - #73044 (compiletest: Add directives to detect sanitizer support)
 - #73054 (memory access sanity checks: abort instead of panic)
 - #73136 (Change how compiler-builtins gets many CGUs)
 - #73280 (Add E0763)
 - #73317 (bootstrap: read config from $RUST_BOOTSTRAP_CONFIG)
 - #73350 (bootstrap/install.rs: support a nonexistent `prefix` in `x.py install`)
 - #73352 (Speed up bootstrap a little.)

Failed merges:

r? @ghost
2020-06-19 12:30:20 +00:00
Ralf Jung
61c8925310
Rollup merge of #73352 - ehuss:bootstrap-metadata, r=Mark-Simulacrum
Speed up bootstrap a little.

The bootstrap script was calling `cargo metadata` 3 times (or 6 with `-v`). This is a very expensive operation, and this attempts to avoid the extra calls. On my system, a simple command like `./x.py test -h -v` goes from about 3 seconds to 0.4.

An overview of the changes:

- Call `cargo metadata` only once with `--no-deps`. Optional dependencies are filtered in `in_tree_crates` (handling `profiler_builtins` and `rustc_codegen_llvm` which are driven by the config).
- Remove a duplicate call to `metadata::build` when using `-v`. I'm not sure why it was there, it looks like a mistake or vestigial from previous behavior.
- Remove check for `_shim`, I believe all the `_shim` crates are now gone.
- Remove check for `rustc_` and `*san` for `test::Crate::should_run`, these are no longer dependencies in the `test` tree.
- Use relative paths in `./x.py test -h -v` output.
- Some code cleanup (remove unnecessary `find_compiler_crates`, etc.).
- Show suite paths (`src/test/ui/...`) in `./x.py test -h -v` output.
- Some doc comments.
2020-06-19 14:29:35 +02:00
Ralf Jung
a59d164490
Rollup merge of #73350 - nodakai:install-rs-support-nonexistent-prefix, r=Mark-Simulacrum
bootstrap/install.rs: support a nonexistent `prefix` in `x.py install`

PR #49778 introduced fs::canonicalize() which fails for a nonexistent path.
This is a surprise for someone used to GNU Autotools' configure which can create any necessary intermediate directories in prefix.

This change makes it run fs::create_dir_all() before canonicalize().
2020-06-19 14:29:33 +02:00
Ralf Jung
0404788178
Rollup merge of #73317 - davidtwco:bootstrap-config-env-var, r=Mark-Simulacrum
bootstrap: read config from $RUST_BOOTSTRAP_CONFIG

This PR modifies bootstrap so that `config.toml` is read first from `RUST_BOOTSTRAP_CONFIG`, then `--config` and finally `config.toml` in the current directory.

This is a subjective change, intended to improve the ergnomics when using "development shells" for rustc development (for example, using tools such as Nix) which set environment variables to ensure a reproducible environment (these development shells can then be version controlled, e.g. [my rustc shell](6b74a5c170/nix/shells/rustc.nix)). By optionally reading `config.toml` from an environment variable, a `config.toml` can be defined in the development shell and a path to it exposed in the `RUST_BOOTSTRAP_CONFIG` environment variable - avoiding the need to manually symlink the contents of this file to `config.toml` in the working directory.
2020-06-19 14:29:31 +02:00
Ralf Jung
45aa36bae5
Rollup merge of #73280 - GuillaumeGomez:add-e0763, r=petrochenkov
Add E0763
2020-06-19 14:29:29 +02:00
Ralf Jung
1e31a7c1e7
Rollup merge of #73136 - alexcrichton:thinlto-compiler-builtins, r=Mark-Simulacrum
Change how compiler-builtins gets many CGUs

This commit intends to fix an accidental regression from #70846. The
goal of #70846 was to build compiler-builtins with a maximal number of
CGUs to ensure that each module in the source corresponds to an object
file. This high degree of control for compiler-builtins is desirable to
ensure that there's at most one exported symbol per CGU, ideally
enabling compiler-builtins to not conflict with the system libgcc as
often.

In #70846, however, only part of the compiler understands that
compiler-builtins is built with many CGUs. The rest of the compiler
thinks it's building with `sess.codegen_units()`. Notably the
calculation of `sess.lto()` consults `sess.codegen_units()`, which when
there's only one CGU it disables ThinLTO. This means that
compiler-builtins is built without ThinLTO, which is quite harmful to
performance! This is the root of the cause from #73135 where intrinsics
were found to not be inlining trivial functions.

The fix applied in this commit is to remove the special-casing of
compiler-builtins in the compiler. Instead the build system is now
responsible for special-casing compiler-builtins. It doesn't know
exactly how many CGUs will be needed but it passes a large number that
is assumed to be much greater than the number of source-level modules
needed. After reading the various locations in the compiler source, this
seemed like the best solution rather than adding more and more special
casing in the compiler for compiler-builtins.

Closes #73135
2020-06-19 14:29:26 +02:00
Ralf Jung
125c196bca
Rollup merge of #73054 - RalfJung:dont-panic, r=Mark-Simulacrum
memory access sanity checks: abort instead of panic

Suggested by @Mark-Simulacrum, this should help reduce the performance impact of these checks.
2020-06-19 14:29:24 +02:00
Ralf Jung
0851036ae3
Rollup merge of #73044 - tmiasko:compiletest-san, r=nikomatsakis
compiletest: Add directives to detect sanitizer support

Add needs-sanitizer-{address,leak,memory,thread} directive indicating
that test requires target with support for specific sanitizer.

This is an addition to the existing needs-sanitizer-support directive
indicating that test requires a sanitizer runtime library.

The existing needs-sanitizer-support directive could be incorporated into the
new ones, but I decided to retain it, since it enables running sanitizer
codegen tests even when building of sanitizer runtime libraries is disabled.
2020-06-19 14:29:22 +02:00
Ralf Jung
1dc6c3c4ad
Rollup merge of #73011 - richkadel:llvm-count-from-mir-pass, r=tmandry
first stage of implementing LLVM code coverage

This PR replaces #70680 (WIP toward LLVM Code Coverage for Rust) since I am re-implementing the Rust LLVM code coverage feature in a different part of the compiler (in MIR pass(es) vs AST).

This PR updates rustc with `-Zinstrument-coverage` option that injects the llvm intrinsic `instrprof.increment()` for code generation.

This initial version only injects counters at the top of each function, and does not yet implement the required coverage map.

Upcoming PRs will add the coverage map, and add more counters and/or counter expressions for each conditional code branch.

Rust compiler MCP https://github.com/rust-lang/compiler-team/issues/278
Relevant issue: #34701 - Implement support for LLVMs code coverage instrumentation

***[I put together some development notes here, under a separate branch.](cfa0b21d34/src/test/codegen/coverage-experiments/README-THIS-IS-TEMPORARY.md)***
2020-06-19 14:29:20 +02:00
Ralf Jung
7cc45183ca
Rollup merge of #72785 - petrochenkov:wholemsvc, r=matthewjasper
linker: MSVC supports linking static libraries as a whole archive
2020-06-19 14:29:18 +02:00
Ralf Jung
70622db43d
Rollup merge of #72280 - nbdd0121:typeck, r=nikomatsakis
Fix up autoderef when reborrowing

Currently `(f)()` and `f.call_mut()` behaves differently if expression `f` contains autoderef in it. This causes a weird error in #72225.

When `f` is type checked, `Deref` is used (this is expected as we can't yet determine if we should use `Fn` or `FnMut`). When subsequently we determine the actual trait to be used, when using the `f.call_mut()` syntax the `Deref` is patched to `DerefMut`, while for the `(f)()` syntax case it is not.

This PR replicates the fixup for the first case.

Fixes #72225
Fixes #68590
2020-06-19 14:29:16 +02:00
LeSeulArtichaut
7b6398657c Apply suggestions from code review
Co-authored-by: nikomatsakis <niko@alum.mit.edu>
2020-06-19 13:47:04 +02:00
LeSeulArtichaut
39e29ce4d0 #[deny(unsafe_op_in_unsafe_fn)] in liballoc 2020-06-19 13:47:01 +02:00
David Wood
a730d888ae
ty: simplify transparent_newtype_field
This commit removes the normalization from `transparent_newtype_field` -
turns out it wasn't necessary and that makes it a bunch simpler -
particularly when handling projections.

Signed-off-by: David Wood <david@davidtw.co>
2020-06-19 11:16:16 +01:00
David Wood
0cccaa0a27
lint: unify enum variant, union and struct logic
This commit applies the changes introduced in #72890 to both enum
variants and unions - where the logic prior to #72890 was duplicated.

Signed-off-by: David Wood <david@davidtw.co>
2020-06-19 11:16:14 +01:00
David Wood
76ad38d992
lint: prohibit fields with opaque types
Opaque types cannot be used in extern declarations, and normally cannot
exist in fields - except with type aliases to `impl Trait` and
projections which normalize to them.

Signed-off-by: David Wood <david@davidtw.co>
2020-06-19 11:16:12 +01:00
marmeladema
0e31380f42 save_analysis: improve handling of enum struct variant
Fixes #61385
2020-06-19 10:35:44 +01:00
David Wood
d5b07373ce
ty: projections in transparent_newtype_field
This commit modifies `transparent_newtype_field` so that it handles
projections with generic parameters, where `normalize_erasing_regions`
would ICE.

Signed-off-by: David Wood <david@davidtw.co>
2020-06-19 10:10:54 +01:00
Bastian Kauschke
06a237fe2c coerce reborrow multi arg test 2020-06-19 11:06:21 +02:00
Bastian Kauschke
9b47586a47 update coercion docs 2020-06-19 11:06:21 +02:00
Bastian Kauschke
0b5007e4b7 merge coercion test folders 2020-06-19 10:55:38 +02:00