]> git.lizzy.rs Git - rust.git/commit
Auto merge of #56225 - alexreg:type_alias_enum_variants, r=petrochenkov
authorbors <bors@rust-lang.org>
Sat, 29 Dec 2018 21:03:11 +0000 (21:03 +0000)
committerbors <bors@rust-lang.org>
Sat, 29 Dec 2018 21:03:11 +0000 (21:03 +0000)
commit59183180f718fc2212828e180f2f856f0db1bb9c
tree23910eebcb2479fd05771ffaa6a447d9b73371e2
parent007115746c6d0234742719dd67efba054abe97ce
parenta4fa7ef2b90880623499e86324b7b40626a02f9d
Auto merge of #56225 - alexreg:type_alias_enum_variants, r=petrochenkov

Implement RFC 2338, "Type alias enum variants"

This PR implements [RFC 2338](https://github.com/rust-lang/rfcs/pull/2338), allowing one to write code like the following.

```rust
#![feature(type_alias_enum_variants)]

enum Foo {
    Bar(i32),
    Baz { i: i32 },
}

type Alias = Foo;

fn main() {
    let t = Alias::Bar(0);
    let t = Alias::Baz { i: 0 };
    match t {
        Alias::Bar(_i) => {}
        Alias::Baz { i: _i } => {}
    }
}
```

Since `Self` can be considered a type alias in this context, it also enables using `Self::Variant` as both a constructor and pattern.

Fixes issues #56199 and #56611.

N.B., after discussing the syntax for type arguments on enum variants with @petrochenkov and @eddyb (there are also a few comments on the [tracking issue](https://github.com/rust-lang/rust/issues/49683)), the consensus seems to be treat the syntax as follows, which ought to be backwards-compatible.

```rust
Option::<u8>::None; // OK
Option::None::<u8>; // OK, but lint in near future (hard error next edition?)
Alias::<u8>::None; // OK
Alias::None::<u8>; // Error
```

I do not know if this will need an FCP, but let's start one if so.
src/librustc/hir/intravisit.rs
src/librustc/hir/lowering.rs
src/librustc/hir/mod.rs
src/librustc/hir/print.rs
src/librustc/ich/impls_hir.rs
src/librustc/ty/mod.rs
src/librustc_mir/hair/cx/expr.rs
src/librustc_resolve/macros.rs
src/librustc_typeck/check/mod.rs
src/librustc_typeck/collect.rs
src/libsyntax/feature_gate.rs