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:
commit
440bda4dc8
12 changed files with 29 additions and 141 deletions
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
|
@ -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> {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(self_struct_ctor)]
|
||||
|
||||
#![allow(dead_code)]
|
||||
|
||||
use std::fmt::Display;
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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`.
|
17
src/test/ui/issues/issue-56202.rs
Normal file
17
src/test/ui/issues/issue-56202.rs
Normal 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() {}
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue