about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2023-05-08 06:49:50 +0800
committeryukang <moorekang@gmail.com>2023-06-03 09:22:47 +0800
commitb002c9ff11805e681d3f5cd9aa33f14d15543bd8 (patch)
treea0f3a5a9100cfdb8f6b61767fcd26cc654cc1e90
parentdd5d7c729d4e8a59708df64002e09dbcbc4005ba (diff)
downloadrust-b002c9ff11805e681d3f5cd9aa33f14d15543bd8.tar.gz
rust-b002c9ff11805e681d3f5cd9aa33f14d15543bd8.zip
remove type ascription feature gate
-rw-r--r--compiler/rustc_ast_passes/src/feature_gate.rs35
-rw-r--r--compiler/rustc_feature/src/active.rs2
-rw-r--r--compiler/rustc_hir_typeck/src/cast.rs4
-rw-r--r--tests/ui/lint/trivial-casts-featuring-type-ascription.stderr4
4 files changed, 5 insertions, 40 deletions
diff --git a/compiler/rustc_ast_passes/src/feature_gate.rs b/compiler/rustc_ast_passes/src/feature_gate.rs
index 274f931e43f..a6fd3b5c943 100644
--- a/compiler/rustc_ast_passes/src/feature_gate.rs
+++ b/compiler/rustc_ast_passes/src/feature_gate.rs
@@ -2,7 +2,7 @@ use rustc_ast as ast;
 use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
 use rustc_ast::{attr, AssocConstraint, AssocConstraintKind, NodeId};
 use rustc_ast::{PatKind, RangeEnd};
-use rustc_errors::{Applicability, StashKey};
+use rustc_errors::StashKey;
 use rustc_feature::{AttributeGate, BuiltinAttribute, Features, GateIssue, BUILTIN_ATTRIBUTE_MAP};
 use rustc_session::parse::{feature_err, feature_err_issue, feature_warn};
 use rustc_session::Session;
@@ -375,43 +375,13 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
     }
 
     fn visit_stmt(&mut self, stmt: &'a ast::Stmt) {
-        if let ast::StmtKind::Semi(expr) = &stmt.kind
-            && let ast::ExprKind::Assign(lhs, _, _) = &expr.kind
-            && let ast::ExprKind::Type(..) = lhs.kind
-            && self.sess.parse_sess.span_diagnostic.err_count() == 0
-            && !self.features.type_ascription
-            && !lhs.span.allows_unstable(sym::type_ascription)
-        {
-            // When we encounter a statement of the form `foo: Ty = val;`, this will emit a type
-            // ascription error, but the likely intention was to write a `let` statement. (#78907).
-            feature_err(
-                &self.sess.parse_sess,
-                sym::type_ascription,
-                lhs.span,
-                "type ascription is experimental",
-            ).span_suggestion_verbose(
-                lhs.span.shrink_to_lo(),
-                "you might have meant to introduce a new binding",
-                "let ",
-                Applicability::MachineApplicable,
-            ).emit();
-        }
         visit::walk_stmt(self, stmt);
     }
 
     fn visit_expr(&mut self, e: &'a ast::Expr) {
         match e.kind {
             ast::ExprKind::Type(..) => {
-                if self.sess.parse_sess.span_diagnostic.err_count() == 0 {
-                    // To avoid noise about type ascription in common syntax errors,
-                    // only emit if it is the *only* error.
-                    gate_feature_post!(
-                        &self,
-                        type_ascription,
-                        e.span,
-                        "type ascription is experimental"
-                    );
-                } else {
+                if self.sess.parse_sess.span_diagnostic.err_count() > 0 {
                     // And if it isn't, cancel the early-pass warning.
                     if let Some(err) = self
                         .sess
@@ -629,7 +599,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
     gate_all!(box_patterns, "box pattern syntax is experimental");
     gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental");
     gate_all!(try_blocks, "`try` blocks are unstable");
-    gate_all!(type_ascription, "type ascription is experimental");
 
     visit::walk_crate(&mut visitor, krate);
 }
diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs
index 4c53f9d8369..549662a72fa 100644
--- a/compiler/rustc_feature/src/active.rs
+++ b/compiler/rustc_feature/src/active.rs
@@ -534,8 +534,6 @@ declare_features! (
     (active, try_blocks, "1.29.0", Some(31436), None),
     /// Allows `impl Trait` to be used inside type aliases (RFC 2515).
     (active, type_alias_impl_trait, "1.38.0", Some(63063), None),
-    /// Allows the use of type ascription in expressions.
-    (active, type_ascription, "1.6.0", Some(23416), None),
     /// Allows creation of instances of a struct by moving fields that have
     /// not changed from prior instances of the same struct (RFC #2528)
     (active, type_changing_struct_update, "1.58.0", Some(86555), None),
diff --git a/compiler/rustc_hir_typeck/src/cast.rs b/compiler/rustc_hir_typeck/src/cast.rs
index 98c683f0200..7a1e830073a 100644
--- a/compiler/rustc_hir_typeck/src/cast.rs
+++ b/compiler/rustc_hir_typeck/src/cast.rs
@@ -689,8 +689,6 @@ impl<'a, 'tcx> CastCheck<'tcx> {
     fn trivial_cast_lint(&self, fcx: &FnCtxt<'a, 'tcx>) {
         let t_cast = self.cast_ty;
         let t_expr = self.expr_ty;
-        let type_asc_or =
-            if fcx.tcx.features().type_ascription { "type ascription or " } else { "" };
         let (adjective, lint) = if t_cast.is_numeric() && t_expr.is_numeric() {
             ("numeric ", lint::builtin::TRIVIAL_NUMERIC_CASTS)
         } else {
@@ -711,7 +709,7 @@ impl<'a, 'tcx> CastCheck<'tcx> {
             |lint| {
                 lint.help(format!(
                     "cast can be replaced by coercion; this might \
-                     require {type_asc_or}a temporary variable"
+                     require a temporary variable"
                 ))
             },
         );
diff --git a/tests/ui/lint/trivial-casts-featuring-type-ascription.stderr b/tests/ui/lint/trivial-casts-featuring-type-ascription.stderr
index 5087807b6c7..159a54873cc 100644
--- a/tests/ui/lint/trivial-casts-featuring-type-ascription.stderr
+++ b/tests/ui/lint/trivial-casts-featuring-type-ascription.stderr
@@ -4,7 +4,7 @@ error: trivial numeric cast: `i32` as `i32`
 LL |     let lugubrious = 12i32 as i32;
    |                      ^^^^^^^^^^^^
    |
-   = help: cast can be replaced by coercion; this might require type ascription or a temporary variable
+   = help: cast can be replaced by coercion; this might require a temporary variable
 note: the lint level is defined here
   --> $DIR/trivial-casts-featuring-type-ascription.rs:1:24
    |
@@ -17,7 +17,7 @@ error: trivial cast: `&u32` as `*const u32`
 LL |     let _ = haunted as *const u32;
    |             ^^^^^^^^^^^^^^^^^^^^^
    |
-   = help: cast can be replaced by coercion; this might require type ascription or a temporary variable
+   = help: cast can be replaced by coercion; this might require a temporary variable
 note: the lint level is defined here
   --> $DIR/trivial-casts-featuring-type-ascription.rs:1:9
    |