@@ -23,15 +23,13 @@ use rustc_span::{sym, Span, Symbol};
2323enum  NonConstExpr  { 
2424 Loop ( hir:: LoopSource ) , 
2525 Match ( hir:: MatchSource ) , 
26-  OrPattern , 
2726} 
2827
2928impl  NonConstExpr  { 
3029 fn  name ( self )  -> String  { 
3130 match  self  { 
3231 Self :: Loop ( src)  => format ! ( "`{}`" ,  src. name( ) ) , 
3332 Self :: Match ( src)  => format ! ( "`{}`" ,  src. name( ) ) , 
34-  Self :: OrPattern  => "or-pattern" . to_string ( ) , 
3533 } 
3634 } 
3735
@@ -40,22 +38,19 @@ impl NonConstExpr {
4038 use  hir:: MatchSource :: * ; 
4139
4240 let  gates:  & [ _ ]  = match  self  { 
43-  Self :: Match ( Normal ) 
44-  |  Self :: Match ( IfDesugar   {  ..  } ) 
45-  |  Self :: Match ( IfLetDesugar   {  ..  } ) 
46-  | Self :: OrPattern   => & [ sym :: const_if_match ] , 
47- 
48-  Self :: Loop ( Loop )  =>  & [ sym :: const_loop ] , 
41+  // A `for` loop's desugaring contains a call to `IntoIterator::into_iter`, 
42+  // so they are not yet allowed with `#![feature(const_loop)]`. 
43+  // Likewise, `?` desugars to a call to `Try::into_result`. 
44+  Self :: Loop ( ForLoop )   | Self :: Match ( ForLoopDesugar  |  TryDesugar  |  AwaitDesugar )   => { 
45+   return   None ; 
46+  } 
4947
50-  Self :: Loop ( While ) 
51-  | Self :: Loop ( WhileLet ) 
52-  | Self :: Match ( WhileDesugar  | WhileLetDesugar )  => { 
53-  & [ sym:: const_loop,  sym:: const_if_match] 
48+  Self :: Loop ( Loop  | While  | WhileLet )  | Self :: Match ( WhileDesugar  | WhileLetDesugar )  => { 
49+  & [ sym:: const_loop] 
5450 } 
5551
56-  // A `for` loop's desugaring contains a call to `IntoIterator::into_iter`, 
57-  // so they are not yet allowed with `#![feature(const_loop)]`. 
58-  _ => return  None , 
52+  // All other matches are allowed. 
53+  Self :: Match ( Normal  | IfDesugar  {  .. }  | IfLetDesugar  {  .. } )  => & [ ] , 
5954 } ; 
6055
6156 Some ( gates) 
@@ -114,17 +109,6 @@ impl<'tcx> CheckConstVisitor<'tcx> {
114109 match  missing_gates. as_slice ( )  { 
115110 & [ ]  => struct_span_err ! ( self . tcx. sess,  span,  E0744 ,  "{}" ,  msg) . emit ( ) , 
116111
117-  // If the user enabled `#![feature(const_loop)]` but not `#![feature(const_if_match)]`, 
118-  // explain why their `while` loop is being rejected. 
119-  & [ gate @ sym:: const_if_match]  if  required_gates. contains ( & sym:: const_loop)  => { 
120-  feature_err ( & self . tcx . sess . parse_sess ,  gate,  span,  & msg) 
121-  . note ( 
122-  "`#![feature(const_loop)]` alone is not sufficient, \  
123-   since this loop expression contains an implicit conditional", 
124-  ) 
125-  . emit ( ) ; 
126-  } 
127- 
128112 & [ missing_primary,  ref  missing_secondary @ ..]  => { 
129113 let  mut  err = feature_err ( & self . tcx . sess . parse_sess ,  missing_primary,  span,  & msg) ; 
130114
@@ -175,15 +159,6 @@ impl<'tcx> Visitor<'tcx> for CheckConstVisitor<'tcx> {
175159 self . recurse_into ( kind,  |this| intravisit:: walk_body ( this,  body) ) ; 
176160 } 
177161
178-  fn  visit_pat ( & mut  self ,  p :  & ' tcx  hir:: Pat < ' tcx > )  { 
179-  if  self . const_kind . is_some ( )  { 
180-  if  let  hir:: PatKind :: Or  {  .. }  = p. kind  { 
181-  self . const_check_violated ( NonConstExpr :: OrPattern ,  p. span ) ; 
182-  } 
183-  } 
184-  intravisit:: walk_pat ( self ,  p) 
185-  } 
186- 
187162 fn  visit_expr ( & mut  self ,  e :  & ' tcx  hir:: Expr < ' tcx > )  { 
188163 match  & e. kind  { 
189164 // Skip the following checks if we are not currently in a const context. 
0 commit comments