1
Fork 0

Rollup merge of #56365 - alexreg:stabilise-self_struct_ctor, r=Centril

Stabilize self_struct_ctor feature.

[**Tracking Issue**](https://github.com/rust-lang/rust/issues/51994)
This commit is contained in:
kennytm 2018-12-01 01:57:34 +08:00
commit 440bda4dc8
No known key found for this signature in database
GPG key ID: FEF6C8051D0E013C
12 changed files with 29 additions and 141 deletions

View file

@ -1,33 +0,0 @@
# `self_struct_ctor`
The tracking issue for this feature is: [#51994]
[#51994]: https://github.com/rust-lang/rust/issues/51994
------------------------
The `self_struct_ctor` feature gate lets you use the special `Self`
identifier as a constructor and a pattern.
A simple example is:
```rust
#![feature(self_struct_ctor)]
struct ST(i32, i32);
impl ST {
fn new() -> Self {
ST(0, 1)
}
fn ctor() -> Self {
Self(1,2) // constructed by `Self`, it is the same as `ST(1, 2)`
}
fn pattern(self) {
match self {
Self(x, y) => println!("{} {}", x, y), // used as a pattern
}
}
}
```

View file

@ -67,7 +67,6 @@ use syntax::ast;
use syntax::ast::*;
use syntax::errors;
use syntax::ext::hygiene::{Mark, SyntaxContext};
use syntax::feature_gate::{emit_feature_err, GateIssue};
use syntax::print::pprust;
use syntax::ptr::P;
use syntax::source_map::{self, respan, CompilerDesugaringKind, Spanned};
@ -3628,7 +3627,6 @@ impl<'a> LoweringContext<'a> {
ParamMode::Optional,
ImplTraitContext::disallowed(),
);
self.check_self_struct_ctor_feature(&qpath);
hir::PatKind::TupleStruct(
qpath,
pats.iter().map(|x| self.lower_pat(x)).collect(),
@ -3643,7 +3641,6 @@ impl<'a> LoweringContext<'a> {
ParamMode::Optional,
ImplTraitContext::disallowed(),
);
self.check_self_struct_ctor_feature(&qpath);
hir::PatKind::Path(qpath)
}
PatKind::Struct(ref path, ref fields, etc) => {
@ -4039,7 +4036,6 @@ impl<'a> LoweringContext<'a> {
ParamMode::Optional,
ImplTraitContext::disallowed(),
);
self.check_self_struct_ctor_feature(&qpath);
hir::ExprKind::Path(qpath)
}
ExprKind::Break(opt_label, ref opt_expr) => {
@ -5102,18 +5098,6 @@ impl<'a> LoweringContext<'a> {
ThinVec::new()));
P(self.expr_call(e.span, from_err, hir_vec![e]))
}
fn check_self_struct_ctor_feature(&self, qp: &hir::QPath) {
if let hir::QPath::Resolved(_, ref p) = qp {
if p.segments.len() == 1 &&
p.segments[0].ident.name == keywords::SelfType.name() &&
!self.sess.features_untracked().self_struct_ctor {
emit_feature_err(&self.sess.parse_sess, "self_struct_ctor",
p.span, GateIssue::Language,
"`Self` struct constructors are unstable");
}
}
}
}
fn body_ids(bodies: &BTreeMap<hir::BodyId, hir::Body>) -> Vec<hir::BodyId> {

View file

@ -117,8 +117,9 @@ impl<'a, 'tcx> Visitor<'tcx> for ReachableContext<'a, 'tcx> {
self.reachable_symbols.insert(node_id);
}
Some(def) => {
let def_id = def.def_id();
if let Some(node_id) = self.tcx.hir.as_local_node_id(def_id) {
if let Some((node_id, def_id)) = def.opt_def_id().and_then(|def_id| {
self.tcx.hir.as_local_node_id(def_id).map(|node_id| (node_id, def_id))
}) {
if self.def_id_represents_local_inlined_item(def_id) {
self.worklist.push(node_id);
} else {

View file

@ -475,9 +475,6 @@ declare_features! (
// Non-builtin attributes in inner attribute position
(active, custom_inner_attributes, "1.30.0", Some(54726), None),
// Self struct constructor (RFC 2302)
(active, self_struct_ctor, "1.30.0", Some(51994), None),
// allow mixing of bind-by-move in patterns and references to
// those identifiers in guards, *if* we are using MIR-borrowck
// (aka NLL). Essentially this means you need to be on
@ -688,9 +685,11 @@ declare_features! (
(accepted, macro_literal_matcher, "1.31.0", Some(35625), None),
// Use `?` as the Kleene "at most one" operator
(accepted, macro_at_most_once_rep, "1.32.0", Some(48075), None),
// Self struct constructor (RFC 2302)
(accepted, self_struct_ctor, "1.32.0", Some(51994), None),
);
// If you change this, please modify src/doc/unstable-book as well. You must
// If you change this, please modify `src/doc/unstable-book` as well. You must
// move that documentation into the relevant place in the other docs, and
// remove the chapter on the flag.

View file

@ -1,7 +1,5 @@
// run-pass
#![feature(self_struct_ctor)]
#![allow(dead_code)]
use std::fmt::Display;

View file

@ -1,22 +0,0 @@
struct ST1(i32, i32);
impl ST1 {
fn ctor() -> Self {
Self(1,2)
//~^ ERROR: `Self` struct constructors are unstable (see issue #51994) [E0658]
}
}
struct ST2;
impl ST2 {
fn ctor() -> Self {
Self
//~^ ERROR: `Self` struct constructors are unstable (see issue #51994) [E0658]
}
}
fn main() {
let _ = ST1::ctor();
let _ = ST2::ctor();
}

View file

@ -1,19 +0,0 @@
error[E0658]: `Self` struct constructors are unstable (see issue #51994)
--> $DIR/feature-gate-self-struct-ctor.rs:5:9
|
LL | Self(1,2)
| ^^^^
|
= help: add #![feature(self_struct_ctor)] to the crate attributes to enable
error[E0658]: `Self` struct constructors are unstable (see issue #51994)
--> $DIR/feature-gate-self-struct-ctor.rs:14:9
|
LL | Self
| ^^^^
|
= help: add #![feature(self_struct_ctor)] to the crate attributes to enable
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0658`.

View file

@ -0,0 +1,17 @@
// compile-pass
trait FooTrait {}
trait BarTrait {
fn foo<T: FooTrait>(_: T) -> Self;
}
struct FooStruct(u32);
impl BarTrait for FooStruct {
fn foo<T: FooTrait>(_: T) -> Self {
Self(u32::default())
}
}
fn main() {}

View file

@ -10,5 +10,4 @@
fn main() {
let Self = 22; //~ ERROR cannot find unit struct/variant or constant `Self` in this scope
//~^ ERROR `Self` struct constructors are unstable (see issue #51994)
}

View file

@ -4,15 +4,6 @@ error[E0531]: cannot find unit struct/variant or constant `Self` in this scope
LL | let Self = 22; //~ ERROR cannot find unit struct/variant or constant `Self` in this scope
| ^^^^ not found in this scope
error[E0658]: `Self` struct constructors are unstable (see issue #51994)
--> $DIR/keyword-self-as-identifier.rs:12:9
|
LL | let Self = 22; //~ ERROR cannot find unit struct/variant or constant `Self` in this scope
| ^^^^
|
= help: add #![feature(self_struct_ctor)] to the crate attributes to enable
error: aborting due to previous error
error: aborting due to 2 previous errors
Some errors occurred: E0531, E0658.
For more information about an error, try `rustc --explain E0531`.
For more information about this error, try `rustc --explain E0531`.

View file

@ -13,14 +13,11 @@ use self::Self as Foo; //~ ERROR unresolved import `self::Self`
pub fn main() {
let Self = 5;
//~^ ERROR cannot find unit struct/variant or constant `Self` in this scope
//~^^ ERROR `Self` struct constructors are unstable (see issue #51994)
match 15 {
Self => (),
//~^ ERROR cannot find unit struct/variant or constant `Self` in this scope
//~^^ ERROR `Self` struct constructors are unstable (see issue #51994)
Foo { x: Self } => (),
//~^ ERROR cannot find unit struct/variant or constant `Self` in this scope
//~^^ ERROR `Self` struct constructors are unstable (see issue #51994)
}
}

View file

@ -11,42 +11,18 @@ LL | let Self = 5;
| ^^^^ not found in this scope
error[E0531]: cannot find unit struct/variant or constant `Self` in this scope
--> $DIR/self_type_keyword-2.rs:19:9
--> $DIR/self_type_keyword-2.rs:18:9
|
LL | Self => (),
| ^^^^ not found in this scope
error[E0531]: cannot find unit struct/variant or constant `Self` in this scope
--> $DIR/self_type_keyword-2.rs:22:18
--> $DIR/self_type_keyword-2.rs:20:18
|
LL | Foo { x: Self } => (),
| ^^^^ not found in this scope
error[E0658]: `Self` struct constructors are unstable (see issue #51994)
--> $DIR/self_type_keyword-2.rs:14:9
|
LL | let Self = 5;
| ^^^^
|
= help: add #![feature(self_struct_ctor)] to the crate attributes to enable
error: aborting due to 4 previous errors
error[E0658]: `Self` struct constructors are unstable (see issue #51994)
--> $DIR/self_type_keyword-2.rs:19:9
|
LL | Self => (),
| ^^^^
|
= help: add #![feature(self_struct_ctor)] to the crate attributes to enable
error[E0658]: `Self` struct constructors are unstable (see issue #51994)
--> $DIR/self_type_keyword-2.rs:22:18
|
LL | Foo { x: Self } => (),
| ^^^^
|
= help: add #![feature(self_struct_ctor)] to the crate attributes to enable
error: aborting due to 7 previous errors
Some errors occurred: E0432, E0531, E0658.
Some errors occurred: E0432, E0531.
For more information about an error, try `rustc --explain E0432`.