From ac94bbef55648a47cbeced428ec13b3f848ba35b Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Fri, 31 May 2019 15:46:08 +0200 Subject: [PATCH 01/21] Stabilize type_alias_enum_variants. --- src/librustc_resolve/lib.rs | 2 +- src/librustc_typeck/astconv.rs | 2 -- src/librustc_typeck/check/method/mod.rs | 3 --- src/librustc_typeck/lib.rs | 17 +---------------- src/libsyntax/feature_gate.rs | 5 ++--- 5 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index fec7bf3b273..1f0a749112a 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -6,7 +6,7 @@ #![feature(label_break_value)] #![feature(nll)] #![feature(rustc_diagnostic_macros)] -#![feature(type_alias_enum_variants)] +#![cfg_attr(bootstrap, feature(type_alias_enum_variants))] #![recursion_limit="256"] diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index c4d841ede07..33b12374bb5 100644 --- a/src/librustc_typeck/astconv.rs +++ b/src/librustc_typeck/astconv.rs @@ -34,7 +34,6 @@ use std::collections::BTreeSet; use std::iter; use std::slice; -use super::{check_type_alias_enum_variants_enabled}; use rustc_data_structures::fx::FxHashSet; #[derive(Debug)] @@ -1599,7 +1598,6 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { }); if let Some(variant_def) = variant_def { if permit_variants { - check_type_alias_enum_variants_enabled(tcx, span); tcx.check_stability(variant_def.def_id, Some(hir_ref_id), span); return Ok((qself_ty, DefKind::Variant, variant_def.def_id)); } else { diff --git a/src/librustc_typeck/check/method/mod.rs b/src/librustc_typeck/check/method/mod.rs index b492197870b..b8b65279fe7 100644 --- a/src/librustc_typeck/check/method/mod.rs +++ b/src/librustc_typeck/check/method/mod.rs @@ -26,7 +26,6 @@ use rustc::infer::{self, InferOk}; use syntax::ast; use syntax_pos::Span; -use crate::{check_type_alias_enum_variants_enabled}; use self::probe::{IsSuggestion, ProbeScope}; pub fn provide(providers: &mut ty::query::Providers<'_>) { @@ -417,8 +416,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { tcx.hygienic_eq(method_name, vd.ident, adt_def.did) }); if let Some(variant_def) = variant_def { - check_type_alias_enum_variants_enabled(tcx, span); - // Braced variants generate unusable names in value namespace (reserved for // possible future use), so variants resolved as associated items may refer to // them as well. It's ok to use the variant's id as a ctor id since an diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs index 79674e4baeb..aafe7408e6c 100644 --- a/src/librustc_typeck/lib.rs +++ b/src/librustc_typeck/lib.rs @@ -105,7 +105,7 @@ use rustc::lint; use rustc::middle; use rustc::session; use rustc::util::common::ErrorReported; -use rustc::session::config::{EntryFnType, nightly_options}; +use rustc::session::config::EntryFnType; use rustc::traits::{ObligationCause, ObligationCauseCode, TraitEngine, TraitEngineExt}; use rustc::ty::subst::SubstsRef; use rustc::ty::{self, Ty, TyCtxt}; @@ -124,21 +124,6 @@ pub struct TypeAndSubsts<'tcx> { ty: Ty<'tcx>, } -fn check_type_alias_enum_variants_enabled<'tcx>(tcx: TyCtxt<'tcx>, span: Span) { - if !tcx.features().type_alias_enum_variants { - let mut err = tcx.sess.struct_span_err( - span, - "enum variants on type aliases are experimental" - ); - if nightly_options::is_nightly_build() { - help!(&mut err, - "add `#![feature(type_alias_enum_variants)]` to the \ - crate attributes to enable"); - } - err.emit(); - } -} - fn require_c_abi_if_c_variadic(tcx: TyCtxt<'_>, decl: &hir::FnDecl, abi: Abi, span: Span) { if decl.c_variadic && !(abi == Abi::C || abi == Abi::Cdecl) { let mut err = struct_span_err!(tcx.sess, span, E0045, diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 004323301a2..2f88eb239bc 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -532,9 +532,6 @@ declare_features! ( // Allows using `reason` in lint attributes and the `#[expect(lint)]` lint check. (active, lint_reasons, "1.31.0", Some(54503), None), - // Allows paths to enum variants on type aliases. - (active, type_alias_enum_variants, "1.31.0", Some(49683), None), - // Allows exhaustive integer pattern matching on `usize` and `isize`. (active, precise_pointer_size_matching, "1.32.0", Some(56354), None), @@ -849,6 +846,8 @@ declare_features! ( (accepted, extern_crate_self, "1.34.0", Some(56409), None), // Allows arbitrary delimited token streams in non-macro attributes. (accepted, unrestricted_attribute_tokens, "1.34.0", Some(55208), None), + // Allows paths to enum variants on type aliases including `Self`. + (accepted, type_alias_enum_variants, "1.37.0", Some(49683), None), // Allows using `#[repr(align(X))]` on enums with equivalent semantics // to wrapping an enum in a wrapper struct with `#[repr(align(X))]`. (accepted, repr_align_enum, "1.37.0", Some(57996), None), From e5060da781d4deea3b7caf81c30b72e1838fcb39 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Fri, 31 May 2019 15:55:17 +0200 Subject: [PATCH 02/21] type_alias_enum_variants: Remove feature gate test. --- .../feature-gate-type_alias_enum_variants.rs | 19 ----------- ...ature-gate-type_alias_enum_variants.stderr | 34 ------------------- 2 files changed, 53 deletions(-) delete mode 100644 src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs b/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs deleted file mode 100644 index c7d3304a128..00000000000 --- a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.rs +++ /dev/null @@ -1,19 +0,0 @@ -enum Foo { - Bar(i32), - Baz { i: i32 }, -} - -type Alias = Foo; - -fn main() { - let t = Alias::Bar(0); - //~^ ERROR enum variants on type aliases are experimental - let t = Alias::Baz { i: 0 }; - //~^ ERROR enum variants on type aliases are experimental - match t { - Alias::Bar(_i) => {} - //~^ ERROR enum variants on type aliases are experimental - Alias::Baz { i: _i } => {} - //~^ ERROR enum variants on type aliases are experimental - } -} diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr b/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr deleted file mode 100644 index 43535af7c69..00000000000 --- a/src/test/ui/feature-gates/feature-gate-type_alias_enum_variants.stderr +++ /dev/null @@ -1,34 +0,0 @@ -error: enum variants on type aliases are experimental - --> $DIR/feature-gate-type_alias_enum_variants.rs:9:13 - | -LL | let t = Alias::Bar(0); - | ^^^^^^^^^^ - | - = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable - -error: enum variants on type aliases are experimental - --> $DIR/feature-gate-type_alias_enum_variants.rs:11:13 - | -LL | let t = Alias::Baz { i: 0 }; - | ^^^^^^^^^^ - | - = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable - -error: enum variants on type aliases are experimental - --> $DIR/feature-gate-type_alias_enum_variants.rs:14:9 - | -LL | Alias::Bar(_i) => {} - | ^^^^^^^^^^^^^^ - | - = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable - -error: enum variants on type aliases are experimental - --> $DIR/feature-gate-type_alias_enum_variants.rs:16:9 - | -LL | Alias::Baz { i: _i } => {} - | ^^^^^^^^^^ - | - = help: add `#![feature(type_alias_enum_variants)]` to the crate attributes to enable - -error: aborting due to 4 previous errors - From 05dc86488067fd62b602a2cbbf566fed67f4e0ff Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 01:04:58 +0200 Subject: [PATCH 03/21] Move type_alias_enum_variants tests to a folder; Strip feature gates. --- .../enum-variant-generic-args-pats-pass.rs} | 2 - .../enum-variant-generic-args.rs | 2 - .../enum-variant-generic-args.stderr | 56 +++++++++---------- .../issue-57866.rs | 2 - .../issue-58006.rs | 1 - .../issue-58006.stderr | 2 +- .../issue-61801-path-pattern-can-infer.rs | 2 - .../type-alias-enum-variants-panic.rs | 2 - .../type-alias-enum-variants-panic.stderr | 6 +- .../type-alias-enum-variants-pass-2.rs} | 2 +- .../type-alias-enum-variants-pass.rs} | 2 +- .../type-alias-enum-variants-priority-2.rs | 2 - ...type-alias-enum-variants-priority-2.stderr | 2 +- .../type-alias-enum-variants-priority-3.rs | 2 - ...type-alias-enum-variants-priority-3.stderr | 2 +- .../type-alias-enum-variants-priority.rs | 2 - .../type-alias-enum-variants-priority.stderr | 6 +- .../type-alias-enum-variants.rs | 2 - .../type-alias-enum-variants.stderr | 2 +- 19 files changed, 40 insertions(+), 59 deletions(-) rename src/test/ui/{pattern/enum-variant-generic-args.rs => type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs} (97%) rename src/test/ui/{ => type-alias-enum-variants}/enum-variant-generic-args.rs (98%) rename src/test/ui/{ => type-alias-enum-variants}/enum-variant-generic-args.stderr (81%) rename src/test/ui/{issues => type-alias-enum-variants}/issue-57866.rs (88%) rename src/test/ui/{issues => type-alias-enum-variants}/issue-58006.rs (86%) rename src/test/ui/{issues => type-alias-enum-variants}/issue-58006.stderr (85%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-panic.rs (92%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-panic.stderr (87%) rename src/test/{run-pass/type-alias-enum-variants-2.rs => ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs} (93%) rename src/test/{run-pass/type-alias-enum-variants.rs => ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs} (93%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-priority-2.rs (79%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-priority-2.stderr (84%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-priority-3.rs (71%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-priority-3.stderr (71%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-priority.rs (85%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants-priority.stderr (80%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants.rs (87%) rename src/test/ui/{ => type-alias-enum-variants}/type-alias-enum-variants.stderr (86%) diff --git a/src/test/ui/pattern/enum-variant-generic-args.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs similarity index 97% rename from src/test/ui/pattern/enum-variant-generic-args.rs rename to src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs index 85599530ea6..faef1fab879 100644 --- a/src/test/ui/pattern/enum-variant-generic-args.rs +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs @@ -1,7 +1,5 @@ // run-pass -#![feature(type_alias_enum_variants)] - #![allow(irrefutable_let_patterns)] #[allow(dead_code)] diff --git a/src/test/ui/enum-variant-generic-args.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs similarity index 98% rename from src/test/ui/enum-variant-generic-args.rs rename to src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs index dd1f5f334df..c22a9c4ecaa 100644 --- a/src/test/ui/enum-variant-generic-args.rs +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs @@ -1,5 +1,3 @@ -#![feature(type_alias_enum_variants)] - enum Enum { TSVariant(T), SVariant { v: T } } type Alias = Enum; type AliasFixed = Enum<()>; diff --git a/src/test/ui/enum-variant-generic-args.stderr b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr similarity index 81% rename from src/test/ui/enum-variant-generic-args.stderr rename to src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr index 97b111a5c85..d3a2e8635e3 100644 --- a/src/test/ui/enum-variant-generic-args.stderr +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:9:25 + --> $DIR/enum-variant-generic-args.rs:7:25 | LL | Self::TSVariant(()); | ^^ expected type parameter, found () @@ -8,19 +8,19 @@ LL | Self::TSVariant(()); found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:11:27 + --> $DIR/enum-variant-generic-args.rs:9:27 | LL | Self::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:13:16 + --> $DIR/enum-variant-generic-args.rs:11:16 | LL | Self::<()>::TSVariant(()); | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:13:31 + --> $DIR/enum-variant-generic-args.rs:11:31 | LL | Self::<()>::TSVariant(()); | ^^ expected type parameter, found () @@ -29,19 +29,19 @@ LL | Self::<()>::TSVariant(()); found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:16:16 + --> $DIR/enum-variant-generic-args.rs:14:16 | LL | Self::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:16:33 + --> $DIR/enum-variant-generic-args.rs:14:33 | LL | Self::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:22:29 + --> $DIR/enum-variant-generic-args.rs:20:29 | LL | Self::SVariant { v: () }; | ^^ expected type parameter, found () @@ -50,13 +50,13 @@ LL | Self::SVariant { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:24:26 + --> $DIR/enum-variant-generic-args.rs:22:26 | LL | Self::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:24:35 + --> $DIR/enum-variant-generic-args.rs:22:35 | LL | Self::SVariant::<()> { v: () }; | ^^ expected type parameter, found () @@ -65,13 +65,13 @@ LL | Self::SVariant::<()> { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:27:16 + --> $DIR/enum-variant-generic-args.rs:25:16 | LL | Self::<()>::SVariant { v: () }; | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:27:35 + --> $DIR/enum-variant-generic-args.rs:25:35 | LL | Self::<()>::SVariant { v: () }; | ^^ expected type parameter, found () @@ -80,19 +80,19 @@ LL | Self::<()>::SVariant { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:30:16 + --> $DIR/enum-variant-generic-args.rs:28:16 | LL | Self::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:30:32 + --> $DIR/enum-variant-generic-args.rs:28:32 | LL | Self::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:30:41 + --> $DIR/enum-variant-generic-args.rs:28:41 | LL | Self::<()>::SVariant::<()> { v: () }; | ^^ expected type parameter, found () @@ -101,85 +101,85 @@ LL | Self::<()>::SVariant::<()> { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:40:29 + --> $DIR/enum-variant-generic-args.rs:38:29 | LL | Enum::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:43:24 + --> $DIR/enum-variant-generic-args.rs:41:24 | LL | Alias::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:45:30 + --> $DIR/enum-variant-generic-args.rs:43:30 | LL | Alias::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:48:29 + --> $DIR/enum-variant-generic-args.rs:46:29 | LL | AliasFixed::TSVariant::<()>(()); | ^^ type argument not allowed error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:50:18 + --> $DIR/enum-variant-generic-args.rs:48:18 | LL | AliasFixed::<()>::TSVariant(()); | ^^ unexpected type argument error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:52:18 + --> $DIR/enum-variant-generic-args.rs:50:18 | LL | AliasFixed::<()>::TSVariant::<()>(()); | ^^ unexpected type argument error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:52:35 + --> $DIR/enum-variant-generic-args.rs:50:35 | LL | AliasFixed::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:58:28 + --> $DIR/enum-variant-generic-args.rs:56:28 | LL | Enum::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:61:23 + --> $DIR/enum-variant-generic-args.rs:59:23 | LL | Alias::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:63:29 + --> $DIR/enum-variant-generic-args.rs:61:29 | LL | Alias::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:66:28 + --> $DIR/enum-variant-generic-args.rs:64:28 | LL | AliasFixed::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:68:18 + --> $DIR/enum-variant-generic-args.rs:66:18 | LL | AliasFixed::<()>::SVariant { v: () }; | ^^ unexpected type argument error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:70:18 + --> $DIR/enum-variant-generic-args.rs:68:18 | LL | AliasFixed::<()>::SVariant::<()> { v: () }; | ^^ unexpected type argument error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:70:34 + --> $DIR/enum-variant-generic-args.rs:68:34 | LL | AliasFixed::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed diff --git a/src/test/ui/issues/issue-57866.rs b/src/test/ui/type-alias-enum-variants/issue-57866.rs similarity index 88% rename from src/test/ui/issues/issue-57866.rs rename to src/test/ui/type-alias-enum-variants/issue-57866.rs index 77c50e53868..fa351ed51dd 100644 --- a/src/test/ui/issues/issue-57866.rs +++ b/src/test/ui/type-alias-enum-variants/issue-57866.rs @@ -1,7 +1,5 @@ // compile-pass -#![feature(type_alias_enum_variants)] - enum Outer { A(T) } diff --git a/src/test/ui/issues/issue-58006.rs b/src/test/ui/type-alias-enum-variants/issue-58006.rs similarity index 86% rename from src/test/ui/issues/issue-58006.rs rename to src/test/ui/type-alias-enum-variants/issue-58006.rs index 1fb5fefa759..c1e56fc4caa 100644 --- a/src/test/ui/issues/issue-58006.rs +++ b/src/test/ui/type-alias-enum-variants/issue-58006.rs @@ -1,4 +1,3 @@ -#![feature(type_alias_enum_variants)] pub enum Enum { A(usize), } diff --git a/src/test/ui/issues/issue-58006.stderr b/src/test/ui/type-alias-enum-variants/issue-58006.stderr similarity index 85% rename from src/test/ui/issues/issue-58006.stderr rename to src/test/ui/type-alias-enum-variants/issue-58006.stderr index c34e133c6c4..dc606957d63 100644 --- a/src/test/ui/issues/issue-58006.stderr +++ b/src/test/ui/type-alias-enum-variants/issue-58006.stderr @@ -1,5 +1,5 @@ error[E0533]: expected unit struct/variant or constant, found tuple variant `::A` - --> $DIR/issue-58006.rs:9:13 + --> $DIR/issue-58006.rs:8:13 | LL | Self::A => (), | ^^^^^^^ diff --git a/src/test/ui/type-alias-enum-variants/issue-61801-path-pattern-can-infer.rs b/src/test/ui/type-alias-enum-variants/issue-61801-path-pattern-can-infer.rs index 21be61acb0c..dfc618b1649 100644 --- a/src/test/ui/type-alias-enum-variants/issue-61801-path-pattern-can-infer.rs +++ b/src/test/ui/type-alias-enum-variants/issue-61801-path-pattern-can-infer.rs @@ -3,8 +3,6 @@ // compile-pass -#![feature(type_alias_enum_variants)] - enum Opt { N, S(T), diff --git a/src/test/ui/type-alias-enum-variants-panic.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs similarity index 92% rename from src/test/ui/type-alias-enum-variants-panic.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs index f97592f5d3b..c75fe6a8fd9 100644 --- a/src/test/ui/type-alias-enum-variants-panic.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs @@ -1,7 +1,5 @@ // ignore-tidy-linelength -#![feature(type_alias_enum_variants)] - #![allow(unreachable_code)] enum Enum { Variant {} } diff --git a/src/test/ui/type-alias-enum-variants-panic.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr similarity index 87% rename from src/test/ui/type-alias-enum-variants-panic.stderr rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr index 24cf85f5278..7a17596cd4a 100644 --- a/src/test/ui/type-alias-enum-variants-panic.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr @@ -1,17 +1,17 @@ error[E0533]: expected unit struct/variant or constant, found struct variant `::Variant` - --> $DIR/type-alias-enum-variants-panic.rs:11:5 + --> $DIR/type-alias-enum-variants-panic.rs:9:5 | LL | Alias::Variant; | ^^^^^^^^^^^^^^ error[E0533]: expected unit struct/variant or constant, found struct variant `::Variant` - --> $DIR/type-alias-enum-variants-panic.rs:13:9 + --> $DIR/type-alias-enum-variants-panic.rs:11:9 | LL | let Alias::Variant = panic!(); | ^^^^^^^^^^^^^^ error[E0164]: expected tuple struct/variant, found struct variant `::Variant` - --> $DIR/type-alias-enum-variants-panic.rs:15:9 + --> $DIR/type-alias-enum-variants-panic.rs:13:9 | LL | let Alias::Variant(..) = panic!(); | ^^^^^^^^^^^^^^^^^^ not a tuple variant or struct diff --git a/src/test/run-pass/type-alias-enum-variants-2.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs similarity index 93% rename from src/test/run-pass/type-alias-enum-variants-2.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs index 0cf413babcb..00b787be3bc 100644 --- a/src/test/run-pass/type-alias-enum-variants-2.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs @@ -1,4 +1,4 @@ -#![feature(type_alias_enum_variants)] +// run-pass #[derive(Debug, PartialEq, Eq)] enum Foo { diff --git a/src/test/run-pass/type-alias-enum-variants.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs similarity index 93% rename from src/test/run-pass/type-alias-enum-variants.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs index 0cf413babcb..00b787be3bc 100644 --- a/src/test/run-pass/type-alias-enum-variants.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs @@ -1,4 +1,4 @@ -#![feature(type_alias_enum_variants)] +// run-pass #[derive(Debug, PartialEq, Eq)] enum Foo { diff --git a/src/test/ui/type-alias-enum-variants-priority-2.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs similarity index 79% rename from src/test/ui/type-alias-enum-variants-priority-2.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs index 295f8acf62f..e7719dc7155 100644 --- a/src/test/ui/type-alias-enum-variants-priority-2.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs @@ -1,5 +1,3 @@ -#![feature(type_alias_enum_variants)] - enum E { V(u8) } diff --git a/src/test/ui/type-alias-enum-variants-priority-2.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr similarity index 84% rename from src/test/ui/type-alias-enum-variants-priority-2.stderr rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr index 10a4b44084a..a6300a3323d 100644 --- a/src/test/ui/type-alias-enum-variants-priority-2.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr @@ -1,5 +1,5 @@ error[E0061]: this function takes 1 parameter but 0 parameters were supplied - --> $DIR/type-alias-enum-variants-priority-2.rs:12:5 + --> $DIR/type-alias-enum-variants-priority-2.rs:10:5 | LL | V(u8) | ----- defined here diff --git a/src/test/ui/type-alias-enum-variants-priority-3.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs similarity index 71% rename from src/test/ui/type-alias-enum-variants-priority-3.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs index 33f96553b57..ff0bfee1ecc 100644 --- a/src/test/ui/type-alias-enum-variants-priority-3.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs @@ -1,5 +1,3 @@ -#![feature(type_alias_enum_variants)] - enum E { V } diff --git a/src/test/ui/type-alias-enum-variants-priority-3.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr similarity index 71% rename from src/test/ui/type-alias-enum-variants-priority-3.stderr rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr index b3451542a25..f179fd82d75 100644 --- a/src/test/ui/type-alias-enum-variants-priority-3.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr @@ -1,5 +1,5 @@ error: expected type, found variant `V` - --> $DIR/type-alias-enum-variants-priority-3.rs:7:15 + --> $DIR/type-alias-enum-variants-priority-3.rs:5:15 | LL | fn check() -> ::V {} | ^^^^^^ diff --git a/src/test/ui/type-alias-enum-variants-priority.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs similarity index 85% rename from src/test/ui/type-alias-enum-variants-priority.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs index 82cd21b09d3..229046cc5cd 100644 --- a/src/test/ui/type-alias-enum-variants-priority.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs @@ -1,5 +1,3 @@ -#![feature(type_alias_enum_variants)] - enum E { V } diff --git a/src/test/ui/type-alias-enum-variants-priority.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr similarity index 80% rename from src/test/ui/type-alias-enum-variants-priority.stderr rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr index b8271807b83..df75cbc6b2b 100644 --- a/src/test/ui/type-alias-enum-variants-priority.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr @@ -1,5 +1,5 @@ error: ambiguous associated item - --> $DIR/type-alias-enum-variants-priority.rs:14:15 + --> $DIR/type-alias-enum-variants-priority.rs:12:15 | LL | fn f() -> Self::V { 0 } | ^^^^^^^ help: use fully-qualified syntax: `::V` @@ -8,12 +8,12 @@ LL | fn f() -> Self::V { 0 } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #57644 note: `V` could refer to variant defined here - --> $DIR/type-alias-enum-variants-priority.rs:4:5 + --> $DIR/type-alias-enum-variants-priority.rs:2:5 | LL | V | ^ note: `V` could also refer to associated type defined here - --> $DIR/type-alias-enum-variants-priority.rs:8:5 + --> $DIR/type-alias-enum-variants-priority.rs:6:5 | LL | type V; | ^^^^^^^ diff --git a/src/test/ui/type-alias-enum-variants.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs similarity index 87% rename from src/test/ui/type-alias-enum-variants.rs rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs index c5974e55692..8fe9695aa59 100644 --- a/src/test/ui/type-alias-enum-variants.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs @@ -1,5 +1,3 @@ -#![feature(type_alias_enum_variants)] - type Alias = Option; fn main() { diff --git a/src/test/ui/type-alias-enum-variants.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr similarity index 86% rename from src/test/ui/type-alias-enum-variants.stderr rename to src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr index 55f250fa7ee..0a03166b3b6 100644 --- a/src/test/ui/type-alias-enum-variants.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr @@ -1,5 +1,5 @@ error[E0109]: type arguments are not allowed for this type - --> $DIR/type-alias-enum-variants.rs:9:27 + --> $DIR/type-alias-enum-variants.rs:7:27 | LL | let _ = Alias::None::; // Error | ^^ type argument not allowed From 0d27995b0dc38322180af4e2ea53b538aaca5075 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 02:37:23 +0200 Subject: [PATCH 04/21] type_alias_enum_variants: remove duplicate run-pass test. --- .../type-alias-enum-variants-pass-2.rs | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs deleted file mode 100644 index 00b787be3bc..00000000000 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass-2.rs +++ /dev/null @@ -1,30 +0,0 @@ -// run-pass - -#[derive(Debug, PartialEq, Eq)] -enum Foo { - Bar(i32), - Baz { i: i32 }, -} - -type FooAlias = Foo; -type OptionAlias = Option; - -impl Foo { - fn foo() -> Self { - Self::Bar(3) - } -} - -fn main() { - let t = FooAlias::Bar(1); - assert_eq!(t, Foo::Bar(1)); - let t = FooAlias::Baz { i: 2 }; - assert_eq!(t, Foo::Baz { i: 2 }); - match t { - FooAlias::Bar(_i) => {} - FooAlias::Baz { i } => { assert_eq!(i, 2); } - } - assert_eq!(Foo::foo(), Foo::Bar(3)); - - assert_eq!(OptionAlias::Some(4), Option::Some(4)); -} From 86422582dfa20a69d22ff421e0549a4546f275a9 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 02:57:50 +0200 Subject: [PATCH 05/21] Cleanup type-alias-enum-variants.rs test. --- .../type-alias-enum-variants/type-alias-enum-variants.rs | 9 +++++++-- .../type-alias-enum-variants.stderr | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs index 8fe9695aa59..c1153fa4dc7 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs @@ -1,9 +1,14 @@ +// Check that a generic type for an `enum` admits type application +// on both the type constructor and the generic type's variant. +// +// Also check that a type alias to said generic type admits type application +// on the type constructor but *NOT* the variant. + type Alias = Option; fn main() { let _ = Option::::None; // OK let _ = Option::None::; // OK (Lint in future!) let _ = Alias::::None; // OK - let _ = Alias::None::; // Error - //~^ type arguments are not allowed for this type + let _ = Alias::None::; //~ ERROR type arguments are not allowed for this type } diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr index 0a03166b3b6..a8972a93002 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr @@ -1,7 +1,7 @@ error[E0109]: type arguments are not allowed for this type - --> $DIR/type-alias-enum-variants.rs:7:27 + --> $DIR/type-alias-enum-variants.rs:13:27 | -LL | let _ = Alias::None::; // Error +LL | let _ = Alias::None::; | ^^ type argument not allowed error: aborting due to previous error From 4f66364fd4241eeb166c0ca41a6f054c711acfc1 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 02:59:48 +0200 Subject: [PATCH 06/21] Rename type-alias-enum-variants.rs to something descriptive. --- ...riants.rs => no-type-application-on-aliased-enum-variant.rs} | 0 ...tderr => no-type-application-on-aliased-enum-variant.stderr} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants.rs => no-type-application-on-aliased-enum-variant.rs} (100%) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants.stderr => no-type-application-on-aliased-enum-variant.stderr} (80%) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs b/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants.rs rename to src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.rs diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr b/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr similarity index 80% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr rename to src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr index a8972a93002..a1064d69251 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants.stderr +++ b/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr @@ -1,5 +1,5 @@ error[E0109]: type arguments are not allowed for this type - --> $DIR/type-alias-enum-variants.rs:13:27 + --> $DIR/no-type-application-on-aliased-enum-variant.rs:13:27 | LL | let _ = Alias::None::; | ^^ type argument not allowed From f5f1144a02c7c6ea847f5b63c685ecca6b8487e0 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 03:31:36 +0200 Subject: [PATCH 07/21] type-alias-enum-variants-priority: elaborate on why this exists. --- .../type-alias-enum-variants-priority.rs | 20 +++++++++++++++++++ .../type-alias-enum-variants-priority.stderr | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs index 229046cc5cd..7f69590400b 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs @@ -1,3 +1,23 @@ +// Check that a projection `Self::V` in a trait implementation, +// with an associated type named `V`, for an `enum` with a variant named `V`, +// results in triggering the deny-by-default lint `ambiguous_associated_items`. +// The lint suggests that qualified syntax should be used instead. +// That is, the user would write `::V`. +// +// The rationale for this is that while `enum` variants do currently +// not exist in the type namespace but solely in the value namespace, +// RFC #2593 "Enum variant types", would add enum variants to the type namespace. +// However, currently `enum` variants are resolved with high priority as +// they are resolved as inherent associated items. +// Should #2953 therefore be implemented, `Self::V` would suddenly switch +// from referring to the associated type `V` instead of the variant `V`. +// The lint exists to keep us forward compatible with #2593. +// +// As a closing note, provided that #2933 was implemented and +// if `enum` variants were given lower priority than associated types, +// it would be impossible to refer to the `enum` variant `V` whereas +// the associated type could be referred to with qualified syntax as seen above. + enum E { V } diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr index df75cbc6b2b..05512ed2bca 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr @@ -1,5 +1,5 @@ error: ambiguous associated item - --> $DIR/type-alias-enum-variants-priority.rs:12:15 + --> $DIR/type-alias-enum-variants-priority.rs:32:15 | LL | fn f() -> Self::V { 0 } | ^^^^^^^ help: use fully-qualified syntax: `::V` @@ -8,12 +8,12 @@ LL | fn f() -> Self::V { 0 } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #57644 note: `V` could refer to variant defined here - --> $DIR/type-alias-enum-variants-priority.rs:2:5 + --> $DIR/type-alias-enum-variants-priority.rs:22:5 | LL | V | ^ note: `V` could also refer to associated type defined here - --> $DIR/type-alias-enum-variants-priority.rs:6:5 + --> $DIR/type-alias-enum-variants-priority.rs:26:5 | LL | type V; | ^^^^^^^ From ff7d6a18adab67d5a5b0fb8280f83fe29ad0c369 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 03:48:54 +0200 Subject: [PATCH 08/21] type-alias-enum-variants-priority: rename to something more descriptive. --- ...num-variant-priority-lint-ambiguous_associated_items.rs} | 0 ...variant-priority-lint-ambiguous_associated_items.stderr} | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-priority.rs => enum-variant-priority-lint-ambiguous_associated_items.rs} (100%) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-priority.stderr => enum-variant-priority-lint-ambiguous_associated_items.stderr} (74%) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs b/src/test/ui/type-alias-enum-variants/enum-variant-priority-lint-ambiguous_associated_items.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.rs rename to src/test/ui/type-alias-enum-variants/enum-variant-priority-lint-ambiguous_associated_items.rs diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr b/src/test/ui/type-alias-enum-variants/enum-variant-priority-lint-ambiguous_associated_items.stderr similarity index 74% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr rename to src/test/ui/type-alias-enum-variants/enum-variant-priority-lint-ambiguous_associated_items.stderr index 05512ed2bca..f0dd689934f 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority.stderr +++ b/src/test/ui/type-alias-enum-variants/enum-variant-priority-lint-ambiguous_associated_items.stderr @@ -1,5 +1,5 @@ error: ambiguous associated item - --> $DIR/type-alias-enum-variants-priority.rs:32:15 + --> $DIR/enum-variant-priority-lint-ambiguous_associated_items.rs:32:15 | LL | fn f() -> Self::V { 0 } | ^^^^^^^ help: use fully-qualified syntax: `::V` @@ -8,12 +8,12 @@ LL | fn f() -> Self::V { 0 } = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #57644 note: `V` could refer to variant defined here - --> $DIR/type-alias-enum-variants-priority.rs:22:5 + --> $DIR/enum-variant-priority-lint-ambiguous_associated_items.rs:22:5 | LL | V | ^ note: `V` could also refer to associated type defined here - --> $DIR/type-alias-enum-variants-priority.rs:26:5 + --> $DIR/enum-variant-priority-lint-ambiguous_associated_items.rs:26:5 | LL | type V; | ^^^^^^^ From 6d1ecb3c950c37ae19e8fbfc52728630124ba41a Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 03:51:13 +0200 Subject: [PATCH 09/21] type-alias-enum-variants-priority-2: account for 'const's + describe test. --- .../type-alias-enum-variants-priority-2.rs | 12 ++++++++++++ .../type-alias-enum-variants-priority-2.stderr | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs index e7719dc7155..fa3e1a35fc2 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs @@ -1,3 +1,6 @@ +// Check that an `enum` variant is resolved, in the value namespace, +// with higher priority than other inherent items when there is a conflict. + enum E { V(u8) } @@ -6,6 +9,15 @@ impl E { fn V() {} } +enum E2 { + V, +} + +impl E2 { + const V: u8 = 0; +} + fn main() { ::V(); //~ ERROR this function takes 1 parameter but 0 parameters were supplied + let _: u8 = ::V; //~ ERROR mismatched types } diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr index a6300a3323d..5c4b038fd30 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr @@ -1,5 +1,5 @@ error[E0061]: this function takes 1 parameter but 0 parameters were supplied - --> $DIR/type-alias-enum-variants-priority-2.rs:10:5 + --> $DIR/type-alias-enum-variants-priority-2.rs:21:5 | LL | V(u8) | ----- defined here @@ -7,6 +7,16 @@ LL | V(u8) LL | ::V(); | ^^^^^^^^ expected 1 parameter -error: aborting due to previous error +error[E0308]: mismatched types + --> $DIR/type-alias-enum-variants-priority-2.rs:22:17 + | +LL | let _: u8 = ::V; + | ^^^^^^^ expected u8, found enum `E2` + | + = note: expected type `u8` + found type `E2` -For more information about this error, try `rustc --explain E0061`. +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0061, E0308. +For more information about an error, try `rustc --explain E0061`. From fd44b7655b7e37c6ef5d07511aa084c089b205ef Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 03:52:45 +0200 Subject: [PATCH 10/21] type-alias-enum-variants-priority-2: rename to something descriptive. --- ...rs => enum-variant-priority-higher-than-other-inherent.rs} | 0 ...> enum-variant-priority-higher-than-other-inherent.stderr} | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-priority-2.rs => enum-variant-priority-higher-than-other-inherent.rs} (100%) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-priority-2.stderr => enum-variant-priority-higher-than-other-inherent.stderr} (79%) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs b/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.rs rename to src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.rs diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr b/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr similarity index 79% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr rename to src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr index 5c4b038fd30..0394ddab46c 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-2.stderr +++ b/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr @@ -1,5 +1,5 @@ error[E0061]: this function takes 1 parameter but 0 parameters were supplied - --> $DIR/type-alias-enum-variants-priority-2.rs:21:5 + --> $DIR/enum-variant-priority-higher-than-other-inherent.rs:21:5 | LL | V(u8) | ----- defined here @@ -8,7 +8,7 @@ LL | ::V(); | ^^^^^^^^ expected 1 parameter error[E0308]: mismatched types - --> $DIR/type-alias-enum-variants-priority-2.rs:22:17 + --> $DIR/enum-variant-priority-higher-than-other-inherent.rs:22:17 | LL | let _: u8 = ::V; | ^^^^^^^ expected u8, found enum `E2` From c0c48a6677fbee62db3816643200fb2a755d715b Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 03:59:18 +0200 Subject: [PATCH 11/21] type-alias-enum-variants-priority-3: describe the test. --- .../type-alias-enum-variants-priority-3.rs | 3 +++ .../type-alias-enum-variants-priority-3.stderr | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs index ff0bfee1ecc..11f4b05d0bf 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs @@ -1,3 +1,6 @@ +// Check that the compiler will resolve `::V` to the variant `V` in the type namespace +// but will reject this because `enum` variants do not exist in the type namespace. + enum E { V } diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr index f179fd82d75..74e89076857 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr @@ -1,5 +1,5 @@ error: expected type, found variant `V` - --> $DIR/type-alias-enum-variants-priority-3.rs:5:15 + --> $DIR/type-alias-enum-variants-priority-3.rs:8:15 | LL | fn check() -> ::V {} | ^^^^^^ From d87cae326d90d0a5b02f06a1fa788f1b8a9c6538 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 04:01:27 +0200 Subject: [PATCH 12/21] type-alias-enum-variants-priority-3: rename to something descriptive. --- ...s => resolve-to-enum-variant-in-type-namespace-and-error.rs} | 0 ... resolve-to-enum-variant-in-type-namespace-and-error.stderr} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-priority-3.rs => resolve-to-enum-variant-in-type-namespace-and-error.rs} (100%) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-priority-3.stderr => resolve-to-enum-variant-in-type-namespace-and-error.stderr} (66%) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs b/src/test/ui/type-alias-enum-variants/resolve-to-enum-variant-in-type-namespace-and-error.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.rs rename to src/test/ui/type-alias-enum-variants/resolve-to-enum-variant-in-type-namespace-and-error.rs diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr b/src/test/ui/type-alias-enum-variants/resolve-to-enum-variant-in-type-namespace-and-error.stderr similarity index 66% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr rename to src/test/ui/type-alias-enum-variants/resolve-to-enum-variant-in-type-namespace-and-error.stderr index 74e89076857..f190bfb6983 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-priority-3.stderr +++ b/src/test/ui/type-alias-enum-variants/resolve-to-enum-variant-in-type-namespace-and-error.stderr @@ -1,5 +1,5 @@ error: expected type, found variant `V` - --> $DIR/type-alias-enum-variants-priority-3.rs:8:15 + --> $DIR/resolve-to-enum-variant-in-type-namespace-and-error.rs:8:15 | LL | fn check() -> ::V {} | ^^^^^^ From 77ff38486553f40dee1315ba5c1e8c92c3845403 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 04:42:16 +0200 Subject: [PATCH 13/21] type-alias-enum-variants-pass: harden; account for unit variants. --- .../type-alias-enum-variants-pass.rs | 63 +++++++++++++++---- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs index 00b787be3bc..39677733d52 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs @@ -1,30 +1,69 @@ // run-pass +// Check that it is possible to resolve, in the value namespace, +// to an `enum` variant through a type alias. This includes `Self`. +// Type qualified syntax `::Variant` also works when syntactically valid. + #[derive(Debug, PartialEq, Eq)] enum Foo { Bar(i32), Baz { i: i32 }, + Qux, } type FooAlias = Foo; type OptionAlias = Option; +macro_rules! check_pat { + ($x:expr, $p:pat) => { + assert!(if let $p = $x { true } else { false }); + }; +} + impl Foo { - fn foo() -> Self { - Self::Bar(3) + fn bar() -> Self { + let x = Self::Bar(3); + assert_eq!(x, ::Bar(3)); + check_pat!(x, Self::Bar(3)); + x + } + + fn baz() -> Self { + let x = Self::Baz { i: 42 }; + check_pat!(x, Self::Baz { i: 42 }); + x + } + + fn qux() -> Self { + let x = Self::Qux; + assert_eq!(x, ::Qux); + check_pat!(x, Self::Qux); + check_pat!(x, ::Qux); + x } } fn main() { - let t = FooAlias::Bar(1); - assert_eq!(t, Foo::Bar(1)); - let t = FooAlias::Baz { i: 2 }; - assert_eq!(t, Foo::Baz { i: 2 }); - match t { - FooAlias::Bar(_i) => {} - FooAlias::Baz { i } => { assert_eq!(i, 2); } - } - assert_eq!(Foo::foo(), Foo::Bar(3)); + let bar = Foo::Bar(1); + assert_eq!(bar, FooAlias::Bar(1)); + assert_eq!(bar, ::Bar(1)); + check_pat!(bar, FooAlias::Bar(1)); - assert_eq!(OptionAlias::Some(4), Option::Some(4)); + let baz = FooAlias::Baz { i: 2 }; + assert_eq!(baz, Foo::Baz { i: 2 }); + check_pat!(baz, FooAlias::Baz { i: 2 }); + + let qux = Foo::Qux; + assert_eq!(qux, FooAlias::Qux); + assert_eq!(qux, ::Qux); + check_pat!(qux, FooAlias::Qux); + check_pat!(qux, ::Qux); + + assert_eq!(Foo::bar(), Foo::Bar(3)); + assert_eq!(Foo::baz(), Foo::Baz { i: 42 }); + assert_eq!(Foo::qux(), Foo::Qux); + + let some = Option::Some(4); + assert_eq!(some, OptionAlias::Some(4)); + check_pat!(some, OptionAlias::Some(4)); } From bed189791ef9b900788c40354a2ebe5d0427027a Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 05:52:55 +0200 Subject: [PATCH 14/21] type-alias-enum-variants-panic: harden + describe the test. --- .../type-alias-enum-variants-panic.rs | 22 +++++--- .../type-alias-enum-variants-panic.stderr | 50 +++++++++++++------ 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs index c75fe6a8fd9..f474c078ba4 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs @@ -1,15 +1,23 @@ // ignore-tidy-linelength +// Check that creating/matching on an enum variant through an alias with +// the wrong braced/unit form is caught as an error. + #![allow(unreachable_code)] -enum Enum { Variant {} } +enum Enum { Braced {}, Unit, Tuple() } type Alias = Enum; fn main() { - Alias::Variant; - //~^ ERROR expected unit struct/variant or constant, found struct variant `::Variant` [E0533] - let Alias::Variant = panic!(); - //~^ ERROR expected unit struct/variant or constant, found struct variant `::Variant` [E0533] - let Alias::Variant(..) = panic!(); - //~^ ERROR expected tuple struct/variant, found struct variant `::Variant` [E0164] + Alias::Braced; + //~^ ERROR expected unit struct/variant or constant, found struct variant `::Braced` [E0533] + let Alias::Braced = panic!(); + //~^ ERROR expected unit struct/variant or constant, found struct variant `::Braced` [E0533] + let Alias::Braced(..) = panic!(); + //~^ ERROR expected tuple struct/variant, found struct variant `::Braced` [E0164] + + Alias::Unit(); + //~^ ERROR expected function, found enum variant `::Unit` + let Alias::Unit() = panic!(); + //~^ ERROR expected tuple struct/variant, found unit variant `::Unit` [E0164] } diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr index 7a17596cd4a..fcc13c0360d 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr +++ b/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr @@ -1,21 +1,43 @@ -error[E0533]: expected unit struct/variant or constant, found struct variant `::Variant` - --> $DIR/type-alias-enum-variants-panic.rs:9:5 +error[E0533]: expected unit struct/variant or constant, found struct variant `::Braced` + --> $DIR/type-alias-enum-variants-panic.rs:12:5 | -LL | Alias::Variant; - | ^^^^^^^^^^^^^^ +LL | Alias::Braced; + | ^^^^^^^^^^^^^ -error[E0533]: expected unit struct/variant or constant, found struct variant `::Variant` - --> $DIR/type-alias-enum-variants-panic.rs:11:9 +error[E0533]: expected unit struct/variant or constant, found struct variant `::Braced` + --> $DIR/type-alias-enum-variants-panic.rs:14:9 | -LL | let Alias::Variant = panic!(); - | ^^^^^^^^^^^^^^ +LL | let Alias::Braced = panic!(); + | ^^^^^^^^^^^^^ -error[E0164]: expected tuple struct/variant, found struct variant `::Variant` - --> $DIR/type-alias-enum-variants-panic.rs:13:9 +error[E0164]: expected tuple struct/variant, found struct variant `::Braced` + --> $DIR/type-alias-enum-variants-panic.rs:16:9 | -LL | let Alias::Variant(..) = panic!(); - | ^^^^^^^^^^^^^^^^^^ not a tuple variant or struct +LL | let Alias::Braced(..) = panic!(); + | ^^^^^^^^^^^^^^^^^ not a tuple variant or struct -error: aborting due to 3 previous errors +error[E0618]: expected function, found enum variant `::Unit` + --> $DIR/type-alias-enum-variants-panic.rs:19:5 + | +LL | enum Enum { Braced {}, Unit, Tuple() } + | ---- `::Unit` defined here +... +LL | Alias::Unit(); + | ^^^^^^^^^^^-- + | | + | call expression requires function +help: `::Unit` is a unit variant, you need to write it without the parenthesis + | +LL | ::Unit; + | ^^^^^^^^^^^^^ -For more information about this error, try `rustc --explain E0164`. +error[E0164]: expected tuple struct/variant, found unit variant `::Unit` + --> $DIR/type-alias-enum-variants-panic.rs:21:9 + | +LL | let Alias::Unit() = panic!(); + | ^^^^^^^^^^^^^ not a tuple variant or struct + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0164, E0618. +For more information about an error, try `rustc --explain E0164`. From d358b5f1d8daf6aaefc6f924feca8bc2e800f01c Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 05:56:41 +0200 Subject: [PATCH 15/21] type-alias-enum-variants-panic: rename to something descriptive. --- ... => incorrect-variant-form-through-alias-caught.rs} | 0 ...incorrect-variant-form-through-alias-caught.stderr} | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-panic.rs => incorrect-variant-form-through-alias-caught.rs} (100%) rename src/test/ui/type-alias-enum-variants/{type-alias-enum-variants-panic.stderr => incorrect-variant-form-through-alias-caught.stderr} (80%) diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.rs rename to src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.rs diff --git a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr similarity index 80% rename from src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr rename to src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr index fcc13c0360d..1ee00a0d22d 100644 --- a/src/test/ui/type-alias-enum-variants/type-alias-enum-variants-panic.stderr +++ b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr @@ -1,23 +1,23 @@ error[E0533]: expected unit struct/variant or constant, found struct variant `::Braced` - --> $DIR/type-alias-enum-variants-panic.rs:12:5 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:12:5 | LL | Alias::Braced; | ^^^^^^^^^^^^^ error[E0533]: expected unit struct/variant or constant, found struct variant `::Braced` - --> $DIR/type-alias-enum-variants-panic.rs:14:9 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:14:9 | LL | let Alias::Braced = panic!(); | ^^^^^^^^^^^^^ error[E0164]: expected tuple struct/variant, found struct variant `::Braced` - --> $DIR/type-alias-enum-variants-panic.rs:16:9 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:16:9 | LL | let Alias::Braced(..) = panic!(); | ^^^^^^^^^^^^^^^^^ not a tuple variant or struct error[E0618]: expected function, found enum variant `::Unit` - --> $DIR/type-alias-enum-variants-panic.rs:19:5 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:19:5 | LL | enum Enum { Braced {}, Unit, Tuple() } | ---- `::Unit` defined here @@ -32,7 +32,7 @@ LL | ::Unit; | ^^^^^^^^^^^^^ error[E0164]: expected tuple struct/variant, found unit variant `::Unit` - --> $DIR/type-alias-enum-variants-panic.rs:21:9 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:21:9 | LL | let Alias::Unit() = panic!(); | ^^^^^^^^^^^^^ not a tuple variant or struct From 86c74d3a86c2c001e4c1b9b8876f0ca474ae1a82 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 05:59:36 +0200 Subject: [PATCH 16/21] (type_alias_enum_variants); issue-58006: rename to something descriptive. --- ...06.rs => incorrect-variant-form-through-Self-issue-58006.rs} | 0 ...r => incorrect-variant-form-through-Self-issue-58006.stderr} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/test/ui/type-alias-enum-variants/{issue-58006.rs => incorrect-variant-form-through-Self-issue-58006.rs} (100%) rename src/test/ui/type-alias-enum-variants/{issue-58006.stderr => incorrect-variant-form-through-Self-issue-58006.stderr} (73%) diff --git a/src/test/ui/type-alias-enum-variants/issue-58006.rs b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-Self-issue-58006.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/issue-58006.rs rename to src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-Self-issue-58006.rs diff --git a/src/test/ui/type-alias-enum-variants/issue-58006.stderr b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-Self-issue-58006.stderr similarity index 73% rename from src/test/ui/type-alias-enum-variants/issue-58006.stderr rename to src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-Self-issue-58006.stderr index dc606957d63..128a85e1563 100644 --- a/src/test/ui/type-alias-enum-variants/issue-58006.stderr +++ b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-Self-issue-58006.stderr @@ -1,5 +1,5 @@ error[E0533]: expected unit struct/variant or constant, found tuple variant `::A` - --> $DIR/issue-58006.rs:8:13 + --> $DIR/incorrect-variant-form-through-Self-issue-58006.rs:8:13 | LL | Self::A => (), | ^^^^^^^ From ce48086293e63532fb33584be2c2ea5d67cd1498 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 06:13:11 +0200 Subject: [PATCH 17/21] enum-variant-generic-args-pats-pass: harden + describe. --- .../enum-variant-generic-args-pats-pass.rs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs index faef1fab879..af05dd1b715 100644 --- a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs @@ -1,15 +1,23 @@ // run-pass +// Check that resolving, in the value namespace, to an `enum` variant +// through a type alias is well behaved in the presence of generics. +// We check for situations with: +// 1. a generic type `Alias`, we can type-apply `Alias` when referring to a variant. +// 2. a monotype `AliasFixed` of generic `Enum`, we can refer to variants +// and the type-application of `T` in `AliasFixed` is kept. + #![allow(irrefutable_let_patterns)] #[allow(dead_code)] -enum Enum { TSVariant(T), SVariant { v: T } } +enum Enum { TSVariant(T), SVariant { v: T }, UVariant } type Alias = Enum; type AliasFixed = Enum<()>; macro_rules! is_variant { (TSVariant, $expr:expr) => (is_variant!(@check TSVariant, (_), $expr)); (SVariant, $expr:expr) => (is_variant!(@check SVariant, { v: _ }, $expr)); + (UVariant, $expr:expr) => (is_variant!(@check UVariant, {}, $expr)); (@check $variant:ident, $matcher:tt, $expr:expr) => ( assert!(if let Enum::$variant::<()> $matcher = $expr { true } else { false }, "expr does not have correct type"); @@ -38,4 +46,15 @@ fn main() { is_variant!(SVariant, Alias::<()>::SVariant { v: () }); is_variant!(SVariant, AliasFixed::SVariant { v: () }); + + // Unit variant + + is_variant!(UVariant, Enum::UVariant); + is_variant!(UVariant, Enum::UVariant::<()>); + is_variant!(UVariant, Enum::<()>::UVariant); + + is_variant!(UVariant, Alias::UVariant); + is_variant!(UVariant, Alias::<()>::UVariant); + + is_variant!(UVariant, AliasFixed::UVariant); } From 26f98fdf58b6d3b03f413169c8a2db36fef087dc Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 06:15:16 +0200 Subject: [PATCH 18/21] enum-variant-generic-args-pats-pass: rename; test isn't specific to patterns. --- ...eneric-args-pats-pass.rs => enum-variant-generic-args-pass.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/ui/type-alias-enum-variants/{enum-variant-generic-args-pats-pass.rs => enum-variant-generic-args-pass.rs} (100%) diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs similarity index 100% rename from src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pats-pass.rs rename to src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs From a70653ac7e292670bb90fb57ecce796b09392590 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 06:29:05 +0200 Subject: [PATCH 19/21] enum-variant-generic-args: describe + account for unit variants. --- .../enum-variant-generic-args.rs | 36 ++++- .../enum-variant-generic-args.stderr | 124 ++++++++++++++---- 2 files changed, 130 insertions(+), 30 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs index c22a9c4ecaa..f182c3ba8c7 100644 --- a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs @@ -1,4 +1,10 @@ -enum Enum { TSVariant(T), SVariant { v: T } } +// Checks that applied type arguments of enums, and aliases to them, are respected. +// For example, `Self` is never a type constructor. Therefore, no types can be applied to it. +// +// We also check that the variant to an type-aliased enum cannot be type applied whether +// that alias is generic or monomorphic. + +enum Enum { TSVariant(T), SVariant { v: T }, UVariant } type Alias = Enum; type AliasFixed = Enum<()>; @@ -30,6 +36,16 @@ impl Enum { //~^^ ERROR type arguments are not allowed for this type [E0109] //~^^^ ERROR mismatched types [E0308] } + + fn u_variant() { + Self::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + Self::<()>::UVariant; + //~^ ERROR type arguments are not allowed for this type [E0109] + Self::<()>::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + //~^^ ERROR type arguments are not allowed for this type [E0109] + } } fn main() { @@ -68,4 +84,22 @@ fn main() { AliasFixed::<()>::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed for this type [E0109] //~^^ ERROR wrong number of type arguments: expected 0, found 1 [E0107] + + // Unit variant + + Enum::<()>::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + + Alias::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + Alias::<()>::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + + AliasFixed::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + AliasFixed::<()>::UVariant; + //~^ ERROR wrong number of type arguments: expected 0, found 1 [E0107] + AliasFixed::<()>::UVariant::<()>; + //~^ ERROR type arguments are not allowed for this type [E0109] + //~^^ ERROR wrong number of type arguments: expected 0, found 1 [E0107] } diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr index d3a2e8635e3..ee73622cb7b 100644 --- a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:7:25 + --> $DIR/enum-variant-generic-args.rs:13:25 | LL | Self::TSVariant(()); | ^^ expected type parameter, found () @@ -8,19 +8,19 @@ LL | Self::TSVariant(()); found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:9:27 + --> $DIR/enum-variant-generic-args.rs:15:27 | LL | Self::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:11:16 + --> $DIR/enum-variant-generic-args.rs:17:16 | LL | Self::<()>::TSVariant(()); | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:11:31 + --> $DIR/enum-variant-generic-args.rs:17:31 | LL | Self::<()>::TSVariant(()); | ^^ expected type parameter, found () @@ -29,19 +29,19 @@ LL | Self::<()>::TSVariant(()); found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:14:16 + --> $DIR/enum-variant-generic-args.rs:20:16 | LL | Self::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:14:33 + --> $DIR/enum-variant-generic-args.rs:20:33 | LL | Self::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:20:29 + --> $DIR/enum-variant-generic-args.rs:26:29 | LL | Self::SVariant { v: () }; | ^^ expected type parameter, found () @@ -50,13 +50,13 @@ LL | Self::SVariant { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:22:26 + --> $DIR/enum-variant-generic-args.rs:28:26 | LL | Self::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:22:35 + --> $DIR/enum-variant-generic-args.rs:28:35 | LL | Self::SVariant::<()> { v: () }; | ^^ expected type parameter, found () @@ -65,13 +65,13 @@ LL | Self::SVariant::<()> { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:25:16 + --> $DIR/enum-variant-generic-args.rs:31:16 | LL | Self::<()>::SVariant { v: () }; | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:25:35 + --> $DIR/enum-variant-generic-args.rs:31:35 | LL | Self::<()>::SVariant { v: () }; | ^^ expected type parameter, found () @@ -80,19 +80,19 @@ LL | Self::<()>::SVariant { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:28:16 + --> $DIR/enum-variant-generic-args.rs:34:16 | LL | Self::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:28:32 + --> $DIR/enum-variant-generic-args.rs:34:32 | LL | Self::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0308]: mismatched types - --> $DIR/enum-variant-generic-args.rs:28:41 + --> $DIR/enum-variant-generic-args.rs:34:41 | LL | Self::<()>::SVariant::<()> { v: () }; | ^^ expected type parameter, found () @@ -101,90 +101,156 @@ LL | Self::<()>::SVariant::<()> { v: () }; found type `()` error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:38:29 + --> $DIR/enum-variant-generic-args.rs:41:26 + | +LL | Self::UVariant::<()>; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:43:16 + | +LL | Self::<()>::UVariant; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:45:16 + | +LL | Self::<()>::UVariant::<()>; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:45:32 + | +LL | Self::<()>::UVariant::<()>; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:54:29 | LL | Enum::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:41:24 + --> $DIR/enum-variant-generic-args.rs:57:24 | LL | Alias::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:43:30 + --> $DIR/enum-variant-generic-args.rs:59:30 | LL | Alias::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:46:29 + --> $DIR/enum-variant-generic-args.rs:62:29 | LL | AliasFixed::TSVariant::<()>(()); | ^^ type argument not allowed error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:48:18 + --> $DIR/enum-variant-generic-args.rs:64:18 | LL | AliasFixed::<()>::TSVariant(()); | ^^ unexpected type argument error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:50:18 + --> $DIR/enum-variant-generic-args.rs:66:18 | LL | AliasFixed::<()>::TSVariant::<()>(()); | ^^ unexpected type argument error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:50:35 + --> $DIR/enum-variant-generic-args.rs:66:35 | LL | AliasFixed::<()>::TSVariant::<()>(()); | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:56:28 + --> $DIR/enum-variant-generic-args.rs:72:28 | LL | Enum::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:59:23 + --> $DIR/enum-variant-generic-args.rs:75:23 | LL | Alias::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:61:29 + --> $DIR/enum-variant-generic-args.rs:77:29 | LL | Alias::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:64:28 + --> $DIR/enum-variant-generic-args.rs:80:28 | LL | AliasFixed::SVariant::<()> { v: () }; | ^^ type argument not allowed error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:66:18 + --> $DIR/enum-variant-generic-args.rs:82:18 | LL | AliasFixed::<()>::SVariant { v: () }; | ^^ unexpected type argument error[E0107]: wrong number of type arguments: expected 0, found 1 - --> $DIR/enum-variant-generic-args.rs:68:18 + --> $DIR/enum-variant-generic-args.rs:84:18 | LL | AliasFixed::<()>::SVariant::<()> { v: () }; | ^^ unexpected type argument error[E0109]: type arguments are not allowed for this type - --> $DIR/enum-variant-generic-args.rs:68:34 + --> $DIR/enum-variant-generic-args.rs:84:34 | LL | AliasFixed::<()>::SVariant::<()> { v: () }; | ^^ type argument not allowed -error: aborting due to 28 previous errors +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:90:28 + | +LL | Enum::<()>::UVariant::<()>; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:93:23 + | +LL | Alias::UVariant::<()>; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:95:29 + | +LL | Alias::<()>::UVariant::<()>; + | ^^ type argument not allowed + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:98:28 + | +LL | AliasFixed::UVariant::<()>; + | ^^ type argument not allowed + +error[E0107]: wrong number of type arguments: expected 0, found 1 + --> $DIR/enum-variant-generic-args.rs:100:18 + | +LL | AliasFixed::<()>::UVariant; + | ^^ unexpected type argument + +error[E0107]: wrong number of type arguments: expected 0, found 1 + --> $DIR/enum-variant-generic-args.rs:102:18 + | +LL | AliasFixed::<()>::UVariant::<()>; + | ^^ unexpected type argument + +error[E0109]: type arguments are not allowed for this type + --> $DIR/enum-variant-generic-args.rs:102:34 + | +LL | AliasFixed::<()>::UVariant::<()>; + | ^^ type argument not allowed + +error: aborting due to 39 previous errors Some errors have detailed explanations: E0107, E0109, E0308. For more information about an error, try `rustc --explain E0107`. From 46f405ec4d7c6bf16fc2eaafe7541019f1da2996 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 9 Jun 2019 06:49:41 +0200 Subject: [PATCH 20/21] type_alias_enum_variants: Remove from unstable book. --- .../type-alias-enum-variants.md | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 src/doc/unstable-book/src/language-features/type-alias-enum-variants.md diff --git a/src/doc/unstable-book/src/language-features/type-alias-enum-variants.md b/src/doc/unstable-book/src/language-features/type-alias-enum-variants.md deleted file mode 100644 index bcdeafc4b11..00000000000 --- a/src/doc/unstable-book/src/language-features/type-alias-enum-variants.md +++ /dev/null @@ -1,36 +0,0 @@ -# `type_alias_enum_variants` - -The tracking issue for this feature is: [#49683] - -[#49683]: https://github.com/rust-lang/rust/issues/49683 - ------------------------- - -The `type_alias_enum_variants` feature enables the use of variants on type -aliases that refer to enums, as both a constructor and a pattern. That is, -it allows for the syntax `EnumAlias::Variant`, which behaves exactly the same -as `Enum::Variant` (assuming that `EnumAlias` is an alias for some enum type -`Enum`). - -Note that since `Self` exists as a type alias, this feature also enables the -use of the syntax `Self::Variant` within an impl block for an enum type. - -```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 } => {} - } -} -``` From 57e6869a6be56cd75e382deb313fb5f4d1bb1fda Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 16 Jun 2019 22:00:49 +0200 Subject: [PATCH 21/21] type_alias_enum_variants: cleanup redundant 'allow(unused)'. --- .../enum-variant-generic-args-pass.rs | 1 - .../incorrect-variant-form-through-alias-caught.rs | 2 -- .../incorrect-variant-form-through-alias-caught.stderr | 10 +++++----- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs index af05dd1b715..0c212096f92 100644 --- a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs +++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs @@ -9,7 +9,6 @@ #![allow(irrefutable_let_patterns)] -#[allow(dead_code)] enum Enum { TSVariant(T), SVariant { v: T }, UVariant } type Alias = Enum; type AliasFixed = Enum<()>; diff --git a/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.rs b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.rs index f474c078ba4..ce45d59198a 100644 --- a/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.rs +++ b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.rs @@ -3,8 +3,6 @@ // Check that creating/matching on an enum variant through an alias with // the wrong braced/unit form is caught as an error. -#![allow(unreachable_code)] - enum Enum { Braced {}, Unit, Tuple() } type Alias = Enum; diff --git a/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr index 1ee00a0d22d..c1ea816b7fa 100644 --- a/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr +++ b/src/test/ui/type-alias-enum-variants/incorrect-variant-form-through-alias-caught.stderr @@ -1,23 +1,23 @@ error[E0533]: expected unit struct/variant or constant, found struct variant `::Braced` - --> $DIR/incorrect-variant-form-through-alias-caught.rs:12:5 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:10:5 | LL | Alias::Braced; | ^^^^^^^^^^^^^ error[E0533]: expected unit struct/variant or constant, found struct variant `::Braced` - --> $DIR/incorrect-variant-form-through-alias-caught.rs:14:9 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:12:9 | LL | let Alias::Braced = panic!(); | ^^^^^^^^^^^^^ error[E0164]: expected tuple struct/variant, found struct variant `::Braced` - --> $DIR/incorrect-variant-form-through-alias-caught.rs:16:9 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:14:9 | LL | let Alias::Braced(..) = panic!(); | ^^^^^^^^^^^^^^^^^ not a tuple variant or struct error[E0618]: expected function, found enum variant `::Unit` - --> $DIR/incorrect-variant-form-through-alias-caught.rs:19:5 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:17:5 | LL | enum Enum { Braced {}, Unit, Tuple() } | ---- `::Unit` defined here @@ -32,7 +32,7 @@ LL | ::Unit; | ^^^^^^^^^^^^^ error[E0164]: expected tuple struct/variant, found unit variant `::Unit` - --> $DIR/incorrect-variant-form-through-alias-caught.rs:21:9 + --> $DIR/incorrect-variant-form-through-alias-caught.rs:19:9 | LL | let Alias::Unit() = panic!(); | ^^^^^^^^^^^^^ not a tuple variant or struct