Commit graph

28364 commits

Author SHA1 Message Date
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
Eduard-Mihai Burtescu
a7b0aa0675 rustc_span: move pretty syntax from macro_backtrace to ExpnKind::descr. 2020-01-26 17:18:55 +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
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
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
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
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
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
Yuki Okushi
b9c86a363a
Rollup merge of #68511 - tmiasko:ignore-license, r=alexcrichton
Remove unused ignore-license directives

The tidy check was removed in rust-lang/rust#53617
2020-01-25 07:45:16 +09:00
Yuki Okushi
cecffb6308
Rollup merge of #68504 - tmiasko:check-pass, r=alexcrichton
Use check-pass mode for lint tests and nll tests

Helps with issue #62277.
2020-01-25 07:45:13 +09:00
Yuki Okushi
cbaecee87c
Rollup merge of #68111 - varkor:const-generics-type_name, r=oli-obk
Print constants in `type_name` for const generics

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

r? @oli-obk as there may have been a deliberate decision not to in 5b9848912a (diff-4ed1a72c0bfdf17be769ed520932cd02R80).
2020-01-25 07:45:10 +09:00
Esteban Küber
600e385c43 review comments 2020-01-24 14:03:35 -08:00
Esteban Küber
d493dccef7 Apply resolve_vars_if_possible to returned types for more accurate suggestions 2020-01-24 11:48:17 -08:00
Esteban Küber
34d51b3378 Increase suggestion code window from 6 lines to 20 2020-01-24 11:18:45 -08:00
Esteban Küber
d14a323e74 Use more accurate return path spans
No longer suggest `Box::new(if foo { Type1 } else { Type2 })`, instead
suggesting `if foo { Box::new(Type1) } else { Box::new(Type2) }`.
2020-01-24 10:35:13 -08:00
Thomas Lively
601aa407ee Add opt-level=0 to test 2020-01-24 10:26:39 -08:00
Thomas Lively
7b49c7d743 Update LLVM to fix crash on Emscripten targets
Adds a small Rust regression test for #66308.

r? @alexcrichton
2020-01-24 10:26:39 -08:00
bors
c2d141df59 Auto merge of #68494 - matthewjasper:internal-static-ptrs, r=nikomatsakis
Make pointers to statics internal

Closes #67611

r? @nikomatsakis
2020-01-24 17:18:36 +00:00
varkor
50dd8eaeb9 Print constants in type_name for const generics 2020-01-24 16:23:32 +00:00
Oliver Scherer
9a2d5e87d6 Render const pointers in MIR more compactly 2020-01-24 16:20:58 +01:00
bors
73f76b74ef Auto merge of #68414 - michaelwoerister:share-drop-glue, r=alexcrichton
Also share drop-glue when compiling with -Zshare-generics (i.e. at opt-level=0)

This PR adds drop-glue to the set of monomorphizations that can be shared across crates via `-Zshare-generics`.

This version of the PR might have detrimental effects on performance as it makes lots of stuff dependent on a single query results (`upstream_monomorphizations_for(def_id_of_drop_in_place)`). That should be fixable but let's do a perf run first.

Potentially fixes issue https://github.com/rust-lang/rust/issues/64140. (cc @alexcrichton)
The changes here are related to @matthewjasper's https://github.com/rust-lang/rust/pull/67332 but should be mostly orthogonal.

r? @ghost
2020-01-24 14:00:56 +00:00
Tyler Mandry
1662888126
Rollup merge of #68479 - Tyg13:unused_parens_return, r=Centril
Implement `unused_parens` for block return values

Fixes #68386

r? @Centril
2020-01-24 00:30:59 -08:00
Tyler Mandry
e7752aefdc
Rollup merge of #68469 - ollie27:skip_count, r=sfackler
Avoid overflow in `std::iter::Skip::count`

The call to `count` on the inner iterator can overflow even if `Skip` itself would return less that `usize::max_value()` items.

Fixes #68139
2020-01-24 00:30:56 -08:00
Tyler Mandry
143059deaf
Rollup merge of #68438 - Aaron1011:fix/tait-non-defining, r=estebank
Account for non-types in substs for opaque type error messages

Fixes #68368

Previously, I assumed that the substs contained only types, which caused
the computed index number to be wrong.
2020-01-24 00:30:55 -08:00
Tyler Mandry
eb769ed6b0
Rollup merge of #68424 - estebank:suggest-borrow-for-non-copy-vec, r=davidtwco
Suggest borrowing `Vec<NonCopy>` in for loop

Partially address #64167.
2020-01-24 00:30:53 -08:00
Esteban Küber
55dce720b2 Account for ty::Error when suggesting impl Trait or Box<dyn Trait> 2020-01-23 17:04:09 -08:00
Tomasz Miąsko
2fd6c4a18a Remove unused ignore-license directives
The tidy check was removed in rust-lang/rust#53617
2020-01-24 00:00:00 +00:00
Matthew Jasper
f30a8186f7 Make pointers to statics internal 2020-01-23 21:38:15 +00:00
Matthew Maurer
72aaa3a414 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.
2020-01-23 13:10:04 -08:00
Esteban Küber
6eaf59dfc8 use diagnostic_item and modify wording 2020-01-23 11:51:56 -08:00
Tuomas Lappeteläinen
ad1cdecaeb add a test for #60976
The test fails on 1.36.0 but passes on master.
2020-01-23 15:37:39 +02:00
Michael Woerister
2ceb92bc53 Make drop-glue take advantage of -Zshare-generics. 2020-01-23 13:15:15 +01:00
Tyler Lanphear
6f7e89ffe3 unused-parens: implement for block return values 2020-01-23 00:42:35 -05:00
bors
462fc37fa8 Auto merge of #68298 - Mark-Simulacrum:binary-depdep-fix, r=petrochenkov
Avoid declaring a fake dependency edge

When we're producing an rlib, we do not need anything more than an rmeta file
for each of our dependencies (this is indeed utilized by Cargo for pipelining).
Previously, we were still storing the paths of possible rlib/dylib crates, which
meant that they could still plausibly be accessed. With -Zbinary-dep-depinfo,
that meant that Cargo thought that rustc was using both the rlib and an (earlier
emitted) rmeta, and so needed a recompile, as the rlib may have finished writing
*after* compilation started (for more detail, see issue 68149).

This commit changes metadata loading to not store the filepaths of dylib/rlib if
we're going to end up creating an rlib only.

Fixes #68149.
2020-01-23 03:48:07 +00:00
Tyler Mandry
1077adae12
Rollup merge of #68425 - phi-gamma:try-method, r=varkor
Fix try-op diagnostic in E0277 for methods

For methods the try-op diagnostic displays the empty string where
it has more descriptive strings like “a function” otherwise:

    error[E0277]: the `?` operator can only be used in  that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
                                                      ^^
       | |             ^^ cannot use the `?` operator in  that returns `()`
                                                        ^^

I’m seeing this on nightly (rustc 1.42.0-nightly (b5a3341f1
2020-01-20)) and [on the playpen](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0e7ce7792c2aceb8056941710d539124).

The changeset add strings for impl methods and trait provided
methods and test cases for the option type.
2020-01-22 16:02:17 -08:00
Tyler Mandry
97ac259148
Rollup merge of #68410 - tmiasko:msan-lto, r=varkor
Export weak symbols used by MemorySanitizer

Export weak symbols defined by MemorySanitizer instrumentation, which are used
to implement `-Zsanitizer-memory-track-origins` and `-Zsanitizer-recover=memory`.
Previously, when using fat LTO, they would internalized and eliminated.

Fixes #68367.
2020-01-22 16:02:16 -08:00
Tyler Mandry
bd090c9e8a
Rollup merge of #68388 - varkor:toogeneric-wf, r=eddyb
Make `TooGeneric` error in WF checking a proper error

`TooGeneric` is encountered during WF checking when we cannot determine that a constant involving a generic parameter will always be evaluated successfully (rather than resulting in an error). In these cases, the burden of proof should be with the caller, so that we can avoid post-monomorphisation tim errors (which was the previous previous behaviour). This commit ensures that this situation produces a proper compiler error, rather than silently ignoring it or ICEing.

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

r? @eddyb
2020-01-22 16:02:13 -08:00
Tomasz Miąsko
d915c016c9 Use check-pass mode for lint tests 2020-01-23 00:00:00 +00:00
Tomasz Miąsko
5c73d21eaa Use check-pass mode for nll tests 2020-01-23 00:00:00 +00:00
Oliver Middleton
9d3e84432d Avoid overflow in std::iter::Skip::count
The call to `count` on the inner iterator can overflow even if `Skip` itself would return less that `usize::max_value()` items.
2020-01-22 20:28:28 +00:00