remove type ascription feature gate
This commit is contained in:
parent
dd5d7c729d
commit
b002c9ff11
4 changed files with 5 additions and 40 deletions
|
@ -2,7 +2,7 @@ use rustc_ast as ast;
|
||||||
use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
|
use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
|
||||||
use rustc_ast::{attr, AssocConstraint, AssocConstraintKind, NodeId};
|
use rustc_ast::{attr, AssocConstraint, AssocConstraintKind, NodeId};
|
||||||
use rustc_ast::{PatKind, RangeEnd};
|
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_feature::{AttributeGate, BuiltinAttribute, Features, GateIssue, BUILTIN_ATTRIBUTE_MAP};
|
||||||
use rustc_session::parse::{feature_err, feature_err_issue, feature_warn};
|
use rustc_session::parse::{feature_err, feature_err_issue, feature_warn};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
|
@ -375,43 +375,13 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_stmt(&mut self, stmt: &'a ast::Stmt) {
|
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);
|
visit::walk_stmt(self, stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_expr(&mut self, e: &'a ast::Expr) {
|
fn visit_expr(&mut self, e: &'a ast::Expr) {
|
||||||
match e.kind {
|
match e.kind {
|
||||||
ast::ExprKind::Type(..) => {
|
ast::ExprKind::Type(..) => {
|
||||||
if self.sess.parse_sess.span_diagnostic.err_count() == 0 {
|
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 {
|
|
||||||
// And if it isn't, cancel the early-pass warning.
|
// And if it isn't, cancel the early-pass warning.
|
||||||
if let Some(err) = self
|
if let Some(err) = self
|
||||||
.sess
|
.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!(box_patterns, "box pattern syntax is experimental");
|
||||||
gate_all!(exclusive_range_pattern, "exclusive range 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!(try_blocks, "`try` blocks are unstable");
|
||||||
gate_all!(type_ascription, "type ascription is experimental");
|
|
||||||
|
|
||||||
visit::walk_crate(&mut visitor, krate);
|
visit::walk_crate(&mut visitor, krate);
|
||||||
}
|
}
|
||||||
|
|
|
@ -534,8 +534,6 @@ declare_features! (
|
||||||
(active, try_blocks, "1.29.0", Some(31436), None),
|
(active, try_blocks, "1.29.0", Some(31436), None),
|
||||||
/// Allows `impl Trait` to be used inside type aliases (RFC 2515).
|
/// Allows `impl Trait` to be used inside type aliases (RFC 2515).
|
||||||
(active, type_alias_impl_trait, "1.38.0", Some(63063), None),
|
(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
|
/// Allows creation of instances of a struct by moving fields that have
|
||||||
/// not changed from prior instances of the same struct (RFC #2528)
|
/// not changed from prior instances of the same struct (RFC #2528)
|
||||||
(active, type_changing_struct_update, "1.58.0", Some(86555), None),
|
(active, type_changing_struct_update, "1.58.0", Some(86555), None),
|
||||||
|
|
|
@ -689,8 +689,6 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||||
fn trivial_cast_lint(&self, fcx: &FnCtxt<'a, 'tcx>) {
|
fn trivial_cast_lint(&self, fcx: &FnCtxt<'a, 'tcx>) {
|
||||||
let t_cast = self.cast_ty;
|
let t_cast = self.cast_ty;
|
||||||
let t_expr = self.expr_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() {
|
let (adjective, lint) = if t_cast.is_numeric() && t_expr.is_numeric() {
|
||||||
("numeric ", lint::builtin::TRIVIAL_NUMERIC_CASTS)
|
("numeric ", lint::builtin::TRIVIAL_NUMERIC_CASTS)
|
||||||
} else {
|
} else {
|
||||||
|
@ -711,7 +709,7 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||||
|lint| {
|
|lint| {
|
||||||
lint.help(format!(
|
lint.help(format!(
|
||||||
"cast can be replaced by coercion; this might \
|
"cast can be replaced by coercion; this might \
|
||||||
require {type_asc_or}a temporary variable"
|
require a temporary variable"
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,7 +4,7 @@ error: trivial numeric cast: `i32` as `i32`
|
||||||
LL | let lugubrious = 12i32 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
|
note: the lint level is defined here
|
||||||
--> $DIR/trivial-casts-featuring-type-ascription.rs:1:24
|
--> $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;
|
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
|
note: the lint level is defined here
|
||||||
--> $DIR/trivial-casts-featuring-type-ascription.rs:1:9
|
--> $DIR/trivial-casts-featuring-type-ascription.rs:1:9
|
||||||
|
|
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue