@@ -14,14 +14,12 @@ use rustc_ast::{walk_list, StaticItem};
14
14
use rustc_ast_pretty:: pprust:: { self , State } ;
15
15
use rustc_data_structures:: fx:: FxIndexMap ;
16
16
use rustc_feature:: Features ;
17
- use rustc_macros:: Subdiagnostic ;
18
17
use rustc_parse:: validate_attr;
19
18
use rustc_session:: lint:: builtin:: {
20
19
DEPRECATED_WHERE_CLAUSE_LOCATION , MISSING_ABI , PATTERNS_IN_FNS_WITHOUT_BODY ,
21
20
} ;
22
21
use rustc_session:: lint:: { BuiltinLintDiagnostics , LintBuffer } ;
23
22
use rustc_session:: Session ;
24
- use rustc_span:: source_map:: Spanned ;
25
23
use rustc_span:: symbol:: { kw, sym, Ident } ;
26
24
use rustc_span:: Span ;
27
25
use rustc_target:: spec:: abi;
@@ -69,9 +67,6 @@ struct AstValidator<'a> {
69
67
/// or `Foo::Bar<impl Trait>`
70
68
is_impl_trait_banned : bool ,
71
69
72
- /// See [ForbiddenLetReason]
73
- forbidden_let_reason : Option < ForbiddenLetReason > ,
74
-
75
70
lint_buffer : & ' a mut LintBuffer ,
76
71
}
77
72
@@ -118,26 +113,6 @@ impl<'a> AstValidator<'a> {
118
113
self . with_tilde_const ( Some ( ctx) , f)
119
114
}
120
115
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
-
141
116
fn check_type_alias_where_clause_location (
142
117
& mut self ,
143
118
ty_alias : & TyAlias ,
@@ -779,67 +754,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
779
754
validate_attr:: check_attr ( & self . session . parse_sess , attr) ;
780
755
}
781
756
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
-
843
757
fn visit_ty ( & mut self , ty : & ' a Ty ) {
844
758
self . visit_ty_common ( ty) ;
845
759
self . deny_anon_struct_or_union ( ty) ;
@@ -1601,26 +1515,9 @@ pub fn check_crate(
1601
1515
outer_impl_trait : None ,
1602
1516
disallow_tilde_const : None ,
1603
1517
is_impl_trait_banned : false ,
1604
- forbidden_let_reason : Some ( ForbiddenLetReason :: GenericForbidden ) ,
1605
1518
lint_buffer : lints,
1606
1519
} ;
1607
1520
visit:: walk_crate ( & mut validator, krate) ;
1608
1521
1609
1522
validator. has_proc_macro_decls
1610
1523
}
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