about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-12-01 01:57:34 +0800
committerkennytm <kennytm@gmail.com>2018-12-01 02:03:59 +0800
commit440bda4dc8ba88897490dea25a93448a6bca92f1 (patch)
tree8637289d8d0b1f36c305f50e6d64f05e5ded1d07 /src
parent8641b8d1e254121623620778557b3422f2d460d9 (diff)
parent24717fdaa106ffe1cea7826bdaa8377e0268a183 (diff)
downloadrust-440bda4dc8ba88897490dea25a93448a6bca92f1.tar.gz
rust-440bda4dc8ba88897490dea25a93448a6bca92f1.zip
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)
Diffstat (limited to 'src')
-rw-r--r--src/doc/unstable-book/src/language-features/self-struct-ctor.md33
-rw-r--r--src/librustc/hir/lowering.rs16
-rw-r--r--src/librustc/middle/reachable.rs5
-rw-r--r--src/libsyntax/feature_gate.rs7
-rw-r--r--src/test/run-pass/rfcs/rfc-2302-self-struct-ctor.rs2
-rw-r--r--src/test/ui/feature-gates/feature-gate-self-struct-ctor.rs22
-rw-r--r--src/test/ui/feature-gates/feature-gate-self-struct-ctor.stderr19
-rw-r--r--src/test/ui/issues/issue-56202.rs17
-rw-r--r--src/test/ui/keyword/keyword-self-as-identifier.rs1
-rw-r--r--src/test/ui/keyword/keyword-self-as-identifier.stderr13
-rw-r--r--src/test/ui/self/self_type_keyword-2.rs3
-rw-r--r--src/test/ui/self/self_type_keyword-2.stderr32
12 files changed, 29 insertions, 141 deletions
diff --git a/src/doc/unstable-book/src/language-features/self-struct-ctor.md b/src/doc/unstable-book/src/language-features/self-struct-ctor.md
deleted file mode 100644
index b4742c48a32..00000000000
--- a/src/doc/unstable-book/src/language-features/self-struct-ctor.md
+++ /dev/null
@@ -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
-        }
-    }
-}
-```
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index b3ba2968c9f..dc8baa112bb 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -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> {
diff --git a/src/librustc/middle/reachable.rs b/src/librustc/middle/reachable.rs
index 0009a517dd1..ab0094df0e2 100644
--- a/src/librustc/middle/reachable.rs
+++ b/src/librustc/middle/reachable.rs
@@ -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 {
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index c93abc39ff3..2402de5a816 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -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.
 
diff --git a/src/test/run-pass/rfcs/rfc-2302-self-struct-ctor.rs b/src/test/run-pass/rfcs/rfc-2302-self-struct-ctor.rs
index 156e240e442..1ec20c50034 100644
--- a/src/test/run-pass/rfcs/rfc-2302-self-struct-ctor.rs
+++ b/src/test/run-pass/rfcs/rfc-2302-self-struct-ctor.rs
@@ -1,7 +1,5 @@
 // run-pass
 
-#![feature(self_struct_ctor)]
-
 #![allow(dead_code)]
 
 use std::fmt::Display;
diff --git a/src/test/ui/feature-gates/feature-gate-self-struct-ctor.rs b/src/test/ui/feature-gates/feature-gate-self-struct-ctor.rs
deleted file mode 100644
index 98eab394913..00000000000
--- a/src/test/ui/feature-gates/feature-gate-self-struct-ctor.rs
+++ /dev/null
@@ -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();
-}
diff --git a/src/test/ui/feature-gates/feature-gate-self-struct-ctor.stderr b/src/test/ui/feature-gates/feature-gate-self-struct-ctor.stderr
deleted file mode 100644
index 6061a0db76e..00000000000
--- a/src/test/ui/feature-gates/feature-gate-self-struct-ctor.stderr
+++ /dev/null
@@ -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`.
diff --git a/src/test/ui/issues/issue-56202.rs b/src/test/ui/issues/issue-56202.rs
new file mode 100644
index 00000000000..bd222b7fe98
--- /dev/null
+++ b/src/test/ui/issues/issue-56202.rs
@@ -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() {}
diff --git a/src/test/ui/keyword/keyword-self-as-identifier.rs b/src/test/ui/keyword/keyword-self-as-identifier.rs
index ad5b8fb6434..b50fc68bed6 100644
--- a/src/test/ui/keyword/keyword-self-as-identifier.rs
+++ b/src/test/ui/keyword/keyword-self-as-identifier.rs
@@ -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)
 }
diff --git a/src/test/ui/keyword/keyword-self-as-identifier.stderr b/src/test/ui/keyword/keyword-self-as-identifier.stderr
index 296269819f8..c47f4aeabef 100644
--- a/src/test/ui/keyword/keyword-self-as-identifier.stderr
+++ b/src/test/ui/keyword/keyword-self-as-identifier.stderr
@@ -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 2 previous errors
+error: aborting due to previous error
 
-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`.
diff --git a/src/test/ui/self/self_type_keyword-2.rs b/src/test/ui/self/self_type_keyword-2.rs
index bbaf060ca87..8331ae0b307 100644
--- a/src/test/ui/self/self_type_keyword-2.rs
+++ b/src/test/ui/self/self_type_keyword-2.rs
@@ -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)
     }
 }
diff --git a/src/test/ui/self/self_type_keyword-2.stderr b/src/test/ui/self/self_type_keyword-2.stderr
index 82529974d0e..972e5bdddc6 100644
--- a/src/test/ui/self/self_type_keyword-2.stderr
+++ b/src/test/ui/self/self_type_keyword-2.stderr
@@ -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[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
+error: aborting due to 4 previous errors
 
-Some errors occurred: E0432, E0531, E0658.
+Some errors occurred: E0432, E0531.
 For more information about an error, try `rustc --explain E0432`.