Commit Graph

106241 Commits

Author SHA1 Message Date
Aaron Hill
4a650324f8
Ensure that we error when calling "const extern fn" with wrong convention
See #64926
2020-01-26 23:05:36 -05:00
bors
320ada6479 Auto merge of #68447 - estebank:sugg-type-param, r=petrochenkov
Suggest defining type parameter when appropriate

```
error[E0412]: cannot find type `T` in this scope
 --> file.rs:3:12
  |
3 | impl Trait<T> for Struct {}
  |     -      ^ not found in this scope
  |     |
  |     help: you might be missing a type parameter: `<T>`
```

Fix #64298.
2020-01-27 03:01:59 +00:00
Matthias Krüger
f7dcdcc0b9 make matches exhaustive 2020-01-27 01:18:18 +01:00
Matthias Krüger
ec61761e46 don't clone types that are copy, round two. 2020-01-27 01:18:18 +01:00
bors
c3681d62ee Auto merge of #68122 - Centril:stabilize-transparent-enums, r=petrochenkov
Stabilize `#[repr(transparent)]` on `enum`s in Rust 1.42.0

# Stabilization report

The following is the stabilization report for `#![feature(transparent_enums)]`.

Tracking issue: https://github.com/rust-lang/rust/issues/60405
[Version target](https://forge.rust-lang.org/#current-release-versions): 1.42 (2020-01-30 => beta, 2020-03-12 => stable).

## User guide

A `struct` with only a single non-ZST field (let's call it `foo`) can be marked as `#[repr(transparent)]`. Such a `struct` has the same layout and ABI as `foo`. Here, we also extend this ability to `enum`s with only one variant, subject to the same restrictions as for the equivalent `struct`. That is, you can now write:

```rust
#[repr(transparent)]
enum Foo { Bar(u8) }
```

which, in terms of layout and ABI, is equivalent to:

```rust
#[repr(transparent)]
struct Foo(u8);
```

## Motivation

This is not a major feature that will unlock new and important use-cases. The utility of `repr(transparent)` `enum`s is indeed limited. However, there is still some value in it:

1. It provides conceptual simplification of the language in terms of treating univariant `enum`s and `struct`s the same, as both are product types. Indeed, languages like Haskell only have `data` as the only way to construct user-defined ADTs in the language.

2. In rare occasions, it might be that the user started out with a univariant `enum` for whatever reason (e.g. they thought they might extend it later). Now they want to make this `enum` `transparent` without breaking users by turning it into a `struct`. By lifting the restriction here, now they can.

## Technical specification

The reference specifies [`repr(transparent)` on a `struct`](https://doc.rust-lang.org/nightly/reference/type-layout.html#the-transparent-representation) as:

> ### The transparent Representation
>
>  The `transparent` representation can only be used on `struct`s that have:
>  - a single field with non-zero size, and
>  - any number of fields with size 0 and alignment 1 (e.g. `PhantomData<T>`).
>
> Structs with this representation have the same layout and ABI as the single non-zero sized field.
>
> This is different than the `C` representation because a struct with the `C` representation will always have the ABI of a `C` `struct` while, for example, a struct with the `transparent` representation with a primitive field will have the ABI of the primitive field.
>
> Because this representation delegates type layout to another type, it cannot be used with any other representation.

Here, we amend this to include univariant `enum`s as well with the same static restrictions and the same effects on dynamic semantics.

## Tests

All the relevant tests are adjusted in the PR diff but are recounted here:

- `src/test/ui/repr/repr-transparent.rs` checks that `repr(transparent)` on an `enum` must be univariant, rather than having zero or more than one variant. Restrictions on the fields inside the only variants, like for those on `struct`s, are also checked here.

- A number of codegen tests are provided as well:
    - `src/test/codegen/repr-transparent.rs` (the canonical test)
    - `src/test/codegen/repr-transparent-aggregates-1.rs`
    - `src/test/codegen/repr-transparent-aggregates-2.rs`
    - `src/test/codegen/repr-transparent-aggregates-3.rs`

- `src/test/ui/lint/lint-ctypes-enum.rs` tests the interactions with the `improper_ctypes` lint.

## History

- 2019-04-30, RFC https://github.com/rust-lang/rfcs/pull/2645
  Author: @mjbshaw
  Reviewers: The Language Team

  This is the RFC that proposes allowing `#[repr(transparent)]` on `enum`s and `union`.

- 2019-06-11, PR https://github.com/rust-lang/rust/pull/60463
  Author: @mjbshaw
  Reviewers: @varkor and @rkruppe

  The PR implements the RFC aforementioned in full.

- 2019, PR https://github.com/rust-lang/rust/pull/67323
  Author: @Centril
  Reviewers: @davidtwco

  The PR reorganizes the static checks taking advantage of the fact that `struct`s and `union`s are internally represented as ADTs with a single variant.

- This PR stabilizes `transparent_enums`.

## Related / possible future work

The remaining work here is to figure out the semantics of `#[repr(transparent)]` on `union`s and stabilize those. This work continues to be tracked in https://github.com/rust-lang/rust/issues/60405.
2020-01-27 00:05:57 +00:00
Tomasz Miąsko
47fd27a637 Move sanitizer tests to a separate directory 2020-01-27 00:00:00 +00:00
Tomasz Miąsko
461aada2fe Add use after scope example to the unstable book 2020-01-27 17:01:30 +01:00
Tomasz Miąsko
08a1c566a7 Detect use-after-scope bugs with AddressSanitizer
Enable use-after-scope checks by default when using AddressSanitizer.
They allow to detect incorrect use of stack objects after their scope
have already ended. The detection is based on LLVM lifetime intrinsics.

To facilitate the use of this functionality, the lifetime intrinsics are
now emitted regardless of optimization level if enabled sanitizer makes
use of them.
2020-01-27 16:56:25 +01:00
Tomasz Miąsko
3c02afe965 compiletest: Don't load TestProps from a directories 2020-01-27 00:00:00 +00:00
Tomasz Miąsko
db7ee95345 compiletest: Derive Default for EarlyProps 2020-01-27 00:00:00 +00:00
Tomasz Miąsko
9a154a94b3 compiletest: Remove unused llvm-cxxflags option 2020-01-27 12:08:53 +01:00
Tomasz Miąsko
d857f6f1ab compiletest: Add unit tests for EarlyProps 2020-01-27 12:08:53 +01:00
Tomasz Miąsko
bb6aac3813 compiletest: Update mode list displayed in --help 2020-01-27 12:08:53 +01:00
Tomasz Miąsko
5ebec91abb compiletest: Parse EarlyProps from a reader 2020-01-27 12:08:53 +01:00
Tomasz Miąsko
a6137fb730 compiletest: Remove unnecessary memory allocation in iter_header
Replace `BufRead::lines` with `BuRead::read_line` to reduce memory allocations.
2020-01-27 12:08:53 +01:00
Oliver Middleton
bbc2ae7590 rustdoc: Fix re-exporting primitive types
* Generate links to the primitive type docs for re-exports.
* Don't ICE on cross crate primitive type re-exports.
* Make primitive type re-exports show up cross crate.
2020-01-26 21:32:43 +00:00
bors
a237641c7d Auto merge of #68407 - eddyb:iter-macro-backtrace, r=petrochenkov
rustc_span: return an impl Iterator instead of a Vec from macro_backtrace.

Having `Span::macro_backtrace` produce an `impl Iterator<Item = ExpnData>` allows #67359 to use it instead of rolling its own similar functionality.

The move from `MacroBacktrace` to `ExpnData` (which the first two commits are prerequisites for) both eliminates unnecessary allocations, and is strictly more flexible (exposes more information).

r? @petrochenkov
2020-01-26 21:01:13 +00:00
Andreas Molzer
47ae565ed4 Add a method to query the capacity of a BufWriter 2020-01-26 21:52:04 +01:00
Esteban Küber
697fdc568e Suggest defining type parameter when appropriate
```
error[E0412]: cannot find type `T` in this scope
 --> file.rs:3:12
  |
3 | impl Trait<T> for Struct {}
  |     -      ^ not found in this scope
  |     |
  |     help: you might be missing a type parameter: `<T>`
```

Fix #64298.
2020-01-26 10:57:18 -08:00
Guillaume Gomez
85079f8b1f Fix run button positionning in case of scrolling 2020-01-26 17:24:40 +01:00
Eduard-Mihai Burtescu
6980f82c0d rustc_span: return an impl Iterator instead of a Vec from macro_backtrace. 2020-01-26 17:18:55 +02:00
Eduard-Mihai Burtescu
75284f8cbd rustc_span: replace MacroBacktrace with ExpnData. 2020-01-26 17:18:55 +02:00
Eduard-Mihai Burtescu
a7b0aa0675 rustc_span: move pretty syntax from macro_backtrace to ExpnKind::descr. 2020-01-26 17:18:55 +02:00
Eduard-Mihai Burtescu
787c458eeb Don't use ExpnKind::descr to get the name of a bang macro. 2020-01-26 17:18:54 +02:00
bors
698fcd38fa Auto merge of #68545 - estebank:verbose-bound-display, r=petrochenkov
Use better bound names in `-Zverbose` mode

r? @petrochenkov as per https://github.com/rust-lang/rust/pull/67951/files#r365524015
2020-01-26 11:48:34 +00:00
bors
3d8778d767 Auto merge of #68522 - estebank:impl-trait-sugg-2, r=oli-obk
Further improve `impl Trait`/`dyn Trait` suggestions

After reading [_Returning Trait Objects_ by Bryce Fisher-Fleig](https://bryce.fisher-fleig.org/blog/returning-trait-objects/), [I noticed that](https://www.reddit.com/r/rust/comments/esueur/returning_trait_objects/ffczl4k/) #68195 had a few bugs due to not ignoring `ty::Error`.

- Account for `ty::Error`.
- Account for `if`/`else` and `match` blocks when pointing at return types and referencing their types.
- Increase the multiline suggestion output from 6 lines to 20.
2020-01-26 08:36:23 +00:00
bors
fe1e81561a Auto merge of #68517 - oli-obk:spaces2, r=nagisa
Don't use spaces before type ascription like colons

Split out of #67133 to make that PR simpler

r? @eddyb
2020-01-26 05:13:14 +00:00
bors
086b2a49ec Auto merge of #68031 - Marwes:fold_list, r=estebank
perf: Avoid creating a SmallVec if nothing changes during a fold

Not sure if this helps but in theory it should be less work than what
the current micro optimization does for `ty::Predicate` lists.

(It would explain the overhead I am seeing from `perf`.)
2020-01-26 01:51:50 +00:00
bors
83beb0a118 Auto merge of #68546 - JohnTitor:rollup-znuot4b, r=JohnTitor
Rollup of 5 pull requests

Successful merges:

 - #68485 (add a test for #60976)
 - #68498 (Add some type-alias-impl-trait regression tests)
 - #68514 (Use Self instead of self return type)
 - #68534 (Update submodules to rust-lang)
 - #68540 (clean up error codes E0229 and E0261)

Failed merges:

r? @ghost
2020-01-25 22:44:39 +00:00
Yuki Okushi
5774dd053b
Rollup merge of #68540 - GuillaumeGomez:err-codes-cleanup-e0229-e0261, r=Dylan-DPC
clean up error codes E0229 and E0261

r? @Dylan-DPC
2020-01-26 06:37:24 +09:00
Yuki Okushi
7beac65eb6
Rollup merge of #68534 - JohnTitor:update-remote-url, r=jonas-schievink
Update submodules to rust-lang

They're on rust-lang now. Should be green as it's the same change as #65963 but let's make sure CI is green also.
2020-01-26 06:37:22 +09:00
Yuki Okushi
424e15ae54
Rollup merge of #68514 - lzutao:fmt-Self, r=Dylan-DPC
Use Self instead of self return type
2020-01-26 06:37:21 +09:00
Yuki Okushi
e7c557b295
Rollup merge of #68498 - Aaron1011:tait-regression-tests, r=Centril
Add some type-alias-impl-trait regression tests

Fixes #57611
Fixes #57807
2020-01-26 06:37:19 +09:00
Yuki Okushi
88429fb5e2
Rollup merge of #68485 - kingslef:fix/test-60976, r=nikomatsakis
add a test for #60976

The test fails on 1.36.0 but passes on master.

Huge thanks for @hellow554 actually digging out the minimized version of the
repro.

Fixes #60976.
2020-01-26 06:37:18 +09:00
Esteban Küber
3fb1810476 Use better bound names in -Zverbose mode 2020-01-25 13:25:19 -08:00
Esteban Küber
16709f032c Revert suggestion window size change 2020-01-25 12:26:33 -08:00
bors
6d3f4e0aab Auto merge of #68530 - estebank:abolish-ice, r=petrochenkov
Do not ICE on multipart suggestions touching multiple files

When encountering a multipart suggestion with spans belonging to
different contexts, skip that suggestion.

Fix #68449. Similar to #68256.
2020-01-25 19:55:26 +00:00
Tomasz Miąsko
7e3c51d085 Instrument C / C++ in MemorySanitizer example
Modify the example to instrument C / C++ in addition to Rust, since it
will be generally required (e.g., when using libbacktrace for symbolication).

Additionally use rustc specific flag to track the origins of unitialized
memory rather than LLVM one.
2020-01-25 19:48:02 +01:00
Guillaume Gomez
7fb8f7d85d clean up error codeS E0229 and E0261 2020-01-25 17:41:55 +01:00
bors
8ad83afe5b Auto merge of #68525 - tlively:emcc-codegen-sigsegv-66308, r=alexcrichton
Update LLVM to fix crash on Emscripten targets

Fixes #66308 (for real this time). r? @alexcrichton
2020-01-25 16:34:53 +00:00
bors
3bf71b3d5c Auto merge of #68516 - oli-obk:spaces, r=eddyb
Render const pointers in MIR more compactly

Split out from #67133 to make that PR simpler

cc @RalfJung

r? @eddyb
2020-01-25 13:14:59 +00:00
Oliver Scherer
ae31436ac7 Don't use spaces before type ascription like colons 2020-01-25 13:19:21 +01:00
Yuki Okushi
cdc6898a90 Update submodules to rust-lang 2020-01-25 17:58:10 +09:00
bors
80a65bcaf2 Auto merge of #68448 - maurer:dyn-cdylib, r=alexcrichton
rustc: Allow cdylibs to link against dylibs

Previously, rustc mandated that cdylibs could only link against rlibs as dependencies (not dylibs).
This commit disables that restriction and tests that it works in a simple case.

I don't have a windows rustc dev environment, so I guessed at the MSVC test code, I'm hoping the CI can run that for me.

Additionally, we might want to consider emitting (through cargo or rustc) some metadata to help C users of a cdylib figure out where all the dylibs they need are. I don't think that should be needed to land this change, as it will still be usable by homogeneous build systems without it.

My new test was templated off the `tests/run-make-fulldeps/cdylib` test. It seemed more appropriate to have it as a separate test, since both foo.rs and bar.rs would need to be replicated to make that test cover both cases, but I can do that if it would be preferred.

If I'm doing anything out of order/process, please let me know; this is only my second change to rustc and the prior one was trivial.

r? alexcrichton
2020-01-25 07:49:40 +00:00
bors
8bf17584e0 Auto merge of #68269 - csmoe:temp, r=estebank
Suggest to shorten temporary borrow from raw pointer

Closes https://github.com/rust-lang/rust/issues/65436
r? @estebank
cc @tmandry
2020-01-25 04:42:56 +00:00
Wesley Wiser
2acf5a30ba [self-profiler] Clean up EventFilter 2020-01-24 21:39:31 -05:00
Wesley Wiser
ea42b1c5b8 [self-profiler] Use ThreadId::as_u64() instead of transmute 2020-01-24 21:38:25 -05:00
Aaron Hill
1605276cc2
Add some type-alias-impl-trait regression tests
Fixes #57611
Fixes #57807
2020-01-24 21:32:00 -05:00
Esteban Küber
b626202087 Do not ICE on multipart suggestions touching multiple files
When encountering a multipart suggestion with spans belonging to
different contexts, skip that suggestion.
2020-01-24 18:03:09 -08:00
bors
8647aa1a2c Auto merge of #68526 - JohnTitor:rollup-3mmljof, r=JohnTitor
Rollup of 6 pull requests

Successful merges:

 - #68111 (Print constants in `type_name` for const generics)
 - #68374 (Fix invalid link to the C++ Exception Handling ABI documentation)
 - #68504 (Use check-pass mode for lint tests and nll tests)
 - #68509 (Clean up error codes E0223 and E0225 explanations)
 - #68511 (Remove unused ignore-license directives)
 - #68515 (Support feature process_set_argv0 for VxWorks)

Failed merges:

r? @ghost
2020-01-24 23:04:54 +00:00