diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index f56a27b9ae0..bca3ed93812 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -44,9 +44,8 @@ use hir; use hir::map::Definitions; use hir::map::definitions::DefPathData; use hir::def_id::{DefIndex, DefId}; -use hir::def::{Def, CtorKind, PathResolution}; +use hir::def::{Def, PathResolution}; use session::Session; -use lint; use std::collections::BTreeMap; use std::iter; @@ -857,22 +856,8 @@ impl<'a> LoweringContext<'a> { } PatKind::Lit(ref e) => hir::PatKind::Lit(self.lower_expr(e)), PatKind::TupleStruct(ref path, ref pats, ddpos) => { - match self.resolver.get_resolution(p.id).map(|d| d.base_def) { - Some(def @ Def::StructCtor(_, CtorKind::Const)) | - Some(def @ Def::VariantCtor(_, CtorKind::Const)) => { - // Temporarily lower `UnitVariant(..)` into `UnitVariant` - // for backward compatibility. - let msg = format!("expected tuple struct/variant, found {} `{}`", - def.kind_name(), path); - self.sess.add_lint( - lint::builtin::MATCH_OF_UNIT_VARIANT_VIA_PAREN_DOTDOT, - p.id, p.span, msg - ); - hir::PatKind::Path(None, self.lower_path(path)) - } - _ => hir::PatKind::TupleStruct(self.lower_path(path), + hir::PatKind::TupleStruct(self.lower_path(path), pats.iter().map(|x| self.lower_pat(x)).collect(), ddpos) - } } PatKind::Path(ref opt_qself, ref path) => { let opt_qself = opt_qself.as_ref().map(|qself| { diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index d378772e655..7fc3f638979 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -143,12 +143,6 @@ declare_lint! { the struct or enum has `#[derive(PartialEq, Eq)]`" } -declare_lint! { - pub MATCH_OF_UNIT_VARIANT_VIA_PAREN_DOTDOT, - Deny, - "unit struct or enum variant erroneously allowed to match via path::ident(..)" -} - declare_lint! { pub RAW_POINTER_DERIVE, Warn, @@ -226,7 +220,6 @@ impl LintPass for HardwiredLints { INVALID_TYPE_PARAM_DEFAULT, ILLEGAL_FLOATING_POINT_CONSTANT_PATTERN, ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN, - MATCH_OF_UNIT_VARIANT_VIA_PAREN_DOTDOT, CONST_ERR, RAW_POINTER_DERIVE, TRANSMUTE_FROM_FN_ITEM_TYPES, diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index bc2979c806f..47d248fe2f2 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -172,11 +172,6 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { id: LintId::of(SUPER_OR_SELF_IN_GLOBAL_PATH), reference: "PR #32403 ", }, - FutureIncompatibleInfo { - id: LintId::of(MATCH_OF_UNIT_VARIANT_VIA_PAREN_DOTDOT), - reference: "RFC 218 ", - }, FutureIncompatibleInfo { id: LintId::of(TRANSMUTE_FROM_FN_ITEM_TYPES), reference: "issue #19925 ", diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 4f41dfc8b64..b573a78d3b3 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2412,15 +2412,11 @@ impl<'a> Resolver<'a> { self.record_def(pat.id, resolution); } - PatKind::TupleStruct(ref path, ref pats, ddpos) => { + PatKind::TupleStruct(ref path, ..) => { self.resolve_pattern_path(pat.id, None, path, ValueNS, |def| { match def { Def::StructCtor(_, CtorKind::Fn) | Def::VariantCtor(_, CtorKind::Fn) => true, - // `UnitVariant(..)` is accepted for backward compatibility. - Def::StructCtor(_, CtorKind::Const) | - Def::VariantCtor(_, CtorKind::Const) - if pats.is_empty() && ddpos.is_some() => true, _ => false, } }, "tuple struct/variant"); diff --git a/src/test/compile-fail/empty-struct-unit-pat-2.rs b/src/test/compile-fail/empty-struct-unit-pat-2.rs deleted file mode 100644 index 993f10e0806..00000000000 --- a/src/test/compile-fail/empty-struct-unit-pat-2.rs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2015 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Can't use unit struct as enum pattern - -// aux-build:empty-struct.rs - -#![feature(relaxed_adts)] - -extern crate empty_struct; -use empty_struct::*; - -struct Empty2; - -enum E { - Empty4 -} - -fn main() { - let e2 = Empty2; - let e4 = E::Empty4; - let xe2 = XEmpty2; - let xe4 = XE::XEmpty4; - - match e2 { - Empty2() => () - //~^ ERROR expected tuple struct/variant, found unit struct `Empty2` - } - match xe2 { - XEmpty2() => () - //~^ ERROR expected tuple struct/variant, found unit struct `XEmpty2` - } - - match e4 { - E::Empty4() => () - //~^ ERROR expected tuple struct/variant, found unit variant `E::Empty4` - } - match xe4 { - XE::XEmpty4() => (), - //~^ ERROR expected tuple struct/variant, found unit variant `XE::XEmpty4` - _ => {}, - } -} diff --git a/src/test/compile-fail/empty-struct-unit-pat-1.rs b/src/test/compile-fail/empty-struct-unit-pat.rs similarity index 64% rename from src/test/compile-fail/empty-struct-unit-pat-1.rs rename to src/test/compile-fail/empty-struct-unit-pat.rs index 273cb48b2d2..90f6ae5755f 100644 --- a/src/test/compile-fail/empty-struct-unit-pat-1.rs +++ b/src/test/compile-fail/empty-struct-unit-pat.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// Can't use unit struct as enum pattern +// Can't use unit struct as tuple struct pattern // aux-build:empty-struct.rs @@ -23,30 +23,39 @@ enum E { Empty4 } -// remove attribute after warning cycle and promoting warnings to errors fn main() { let e2 = Empty2; let e4 = E::Empty4; let xe2 = XEmpty2; let xe4 = XE::XEmpty4; + match e2 { + Empty2() => () //~ ERROR expected tuple struct/variant, found unit struct `Empty2` + } + match xe2 { + XEmpty2() => () //~ ERROR expected tuple struct/variant, found unit struct `XEmpty2` + } match e2 { Empty2(..) => () //~ ERROR expected tuple struct/variant, found unit struct `Empty2` - //~^ WARNING hard error } match xe2 { XEmpty2(..) => () //~ ERROR expected tuple struct/variant, found unit struct `XEmpty2` - //~^ WARNING hard error } + match e4 { + E::Empty4() => () //~ ERROR expected tuple struct/variant, found unit variant `E::Empty4` + } + match xe4 { + XE::XEmpty4() => (), + //~^ ERROR expected tuple struct/variant, found unit variant `XE::XEmpty4` + _ => {}, + } match e4 { E::Empty4(..) => () //~ ERROR expected tuple struct/variant, found unit variant `E::Empty4` - //~^ WARNING hard error } match xe4 { XE::XEmpty4(..) => (), - //~^ ERROR expected tuple struct/variant, found unit variant `XE::XEmpty4` - //~| WARNING hard error + //~^ ERROR expected tuple struct/variant, found unit variant `XE::XEmpty4` _ => {}, } } diff --git a/src/test/run-pass/issue-pr29383.rs b/src/test/compile-fail/issue-pr29383.rs similarity index 74% rename from src/test/run-pass/issue-pr29383.rs rename to src/test/compile-fail/issue-pr29383.rs index defb2c164da..b60c537e1e6 100644 --- a/src/test/run-pass/issue-pr29383.rs +++ b/src/test/compile-fail/issue-pr29383.rs @@ -8,8 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#![allow(match_of_unit_variant_via_paren_dotdot)] - enum E { A, B, @@ -18,7 +16,7 @@ enum E { fn main() { match None { None => {} - Some(E::A(..)) => {} - Some(E::B(..)) => {} + Some(E::A(..)) => {} //~ ERROR expected tuple struct/variant, found unit variant `E::A` + Some(E::B(..)) => {} //~ ERROR expected tuple struct/variant, found unit variant `E::B` } }