@@ -14,14 +14,12 @@ use rustc_ast::{walk_list, StaticItem};
1414use rustc_ast_pretty:: pprust:: { self , State } ;
1515use rustc_data_structures:: fx:: FxIndexMap ;
1616use rustc_feature:: Features ;
17- use rustc_macros:: Subdiagnostic ;
1817use rustc_parse:: validate_attr;
1918use rustc_session:: lint:: builtin:: {
2019 DEPRECATED_WHERE_CLAUSE_LOCATION , MISSING_ABI , PATTERNS_IN_FNS_WITHOUT_BODY ,
2120} ;
2221use rustc_session:: lint:: { BuiltinLintDiagnostics , LintBuffer } ;
2322use rustc_session:: Session ;
24- use rustc_span:: source_map:: Spanned ;
2523use rustc_span:: symbol:: { kw, sym, Ident } ;
2624use rustc_span:: Span ;
2725use rustc_target:: spec:: abi;
@@ -69,9 +67,6 @@ struct AstValidator<'a> {
6967 /// or `Foo::Bar<impl Trait>`
7068 is_impl_trait_banned : bool ,
7169
72- /// See [ForbiddenLetReason]
73- forbidden_let_reason : Option < ForbiddenLetReason > ,
74-
7570 lint_buffer : & ' a mut LintBuffer ,
7671}
7772
@@ -118,26 +113,6 @@ impl<'a> AstValidator<'a> {
118113 self . with_tilde_const ( Some ( ctx) , f)
119114 }
120115
121- fn with_let_management (
122- & mut self ,
123- forbidden_let_reason : Option < ForbiddenLetReason > ,
124- f : impl FnOnce ( & mut Self , Option < ForbiddenLetReason > ) ,
125- ) {
126- let old = mem:: replace ( & mut self . forbidden_let_reason , forbidden_let_reason) ;
127- f ( self , old) ;
128- self . forbidden_let_reason = old;
129- }
130-
131- /// Emits an error banning the `let` expression provided in the given location.
132- fn ban_let_expr ( & self , expr : & ' a Expr , forbidden_let_reason : ForbiddenLetReason ) {
133- let sess = & self . session ;
134- if sess. opts . unstable_features . is_nightly_build ( ) {
135- sess. emit_err ( errors:: ForbiddenLet { span : expr. span , reason : forbidden_let_reason } ) ;
136- } else {
137- sess. emit_err ( errors:: ForbiddenLetStable { span : expr. span } ) ;
138- }
139- }
140-
141116 fn check_type_alias_where_clause_location (
142117 & mut self ,
143118 ty_alias : & TyAlias ,
@@ -779,67 +754,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
779754 validate_attr:: check_attr ( & self . session . parse_sess , attr) ;
780755 }
781756
782- fn visit_expr ( & mut self , expr : & ' a Expr ) {
783- self . with_let_management ( Some ( ForbiddenLetReason :: GenericForbidden ) , |this, forbidden_let_reason| {
784- match & expr. kind {
785- ExprKind :: Binary ( Spanned { node : BinOpKind :: Or , span } , lhs, rhs) => {
786- let local_reason = Some ( ForbiddenLetReason :: NotSupportedOr ( * span) ) ;
787- this. with_let_management ( local_reason, |this, _| this. visit_expr ( lhs) ) ;
788- this. with_let_management ( local_reason, |this, _| this. visit_expr ( rhs) ) ;
789- }
790- ExprKind :: If ( cond, then, opt_else) => {
791- this. visit_block ( then) ;
792- walk_list ! ( this, visit_expr, opt_else) ;
793- this. with_let_management ( None , |this, _| this. visit_expr ( cond) ) ;
794- return ;
795- }
796- ExprKind :: Let ( ..) if let Some ( elem) = forbidden_let_reason => {
797- this. ban_let_expr ( expr, elem) ;
798- } ,
799- ExprKind :: Match ( scrutinee, arms) => {
800- this. visit_expr ( scrutinee) ;
801- for arm in arms {
802- this. visit_expr ( & arm. body ) ;
803- this. visit_pat ( & arm. pat ) ;
804- walk_list ! ( this, visit_attribute, & arm. attrs) ;
805- if let Some ( guard) = & arm. guard {
806- this. with_let_management ( None , |this, _| {
807- this. visit_expr ( guard)
808- } ) ;
809- }
810- }
811- }
812- ExprKind :: Paren ( local_expr) => {
813- fn has_let_expr ( expr : & Expr ) -> bool {
814- match & expr. kind {
815- ExprKind :: Binary ( _, lhs, rhs) => has_let_expr ( lhs) || has_let_expr ( rhs) ,
816- ExprKind :: Let ( ..) => true ,
817- _ => false ,
818- }
819- }
820- let local_reason = if has_let_expr ( local_expr) {
821- Some ( ForbiddenLetReason :: NotSupportedParentheses ( local_expr. span ) )
822- }
823- else {
824- forbidden_let_reason
825- } ;
826- this. with_let_management ( local_reason, |this, _| this. visit_expr ( local_expr) ) ;
827- }
828- ExprKind :: Binary ( Spanned { node : BinOpKind :: And , .. } , ..) => {
829- this. with_let_management ( forbidden_let_reason, |this, _| visit:: walk_expr ( this, expr) ) ;
830- return ;
831- }
832- ExprKind :: While ( cond, then, opt_label) => {
833- walk_list ! ( this, visit_label, opt_label) ;
834- this. visit_block ( then) ;
835- this. with_let_management ( None , |this, _| this. visit_expr ( cond) ) ;
836- return ;
837- }
838- _ => visit:: walk_expr ( this, expr) ,
839- }
840- } ) ;
841- }
842-
843757 fn visit_ty ( & mut self , ty : & ' a Ty ) {
844758 self . visit_ty_common ( ty) ;
845759 self . deny_anon_struct_or_union ( ty) ;
@@ -1601,26 +1515,9 @@ pub fn check_crate(
16011515 outer_impl_trait : None ,
16021516 disallow_tilde_const : None ,
16031517 is_impl_trait_banned : false ,
1604- forbidden_let_reason : Some ( ForbiddenLetReason :: GenericForbidden ) ,
16051518 lint_buffer : lints,
16061519 } ;
16071520 visit:: walk_crate ( & mut validator, krate) ;
16081521
16091522 validator. has_proc_macro_decls
16101523}
1611-
1612- /// Used to forbid `let` expressions in certain syntactic locations.
1613- #[ derive( Clone , Copy , Subdiagnostic ) ]
1614- pub ( crate ) enum ForbiddenLetReason {
1615- /// `let` is not valid and the source environment is not important
1616- GenericForbidden ,
1617- /// A let chain with the `||` operator
1618- #[ note( ast_passes_not_supported_or) ]
1619- NotSupportedOr ( #[ primary_span] Span ) ,
1620- /// A let chain with invalid parentheses
1621- ///
1622- /// For example, `let 1 = 1 && (expr && expr)` is allowed
1623- /// but `(let 1 = 1 && (let 1 = 1 && (let 1 = 1))) && let a = 1` is not
1624- #[ note( ast_passes_not_supported_parentheses) ]
1625- NotSupportedParentheses ( #[ primary_span] Span ) ,
1626- }
0 commit comments