@@ -39,6 +39,7 @@ use rustc_hir::{GenericArg, GenericArgs};
39
39
use rustc_infer:: infer:: { InferCtxt , TyCtxtInferExt } ;
40
40
use rustc_infer:: traits:: ObligationCause ;
41
41
use rustc_middle:: middle:: stability:: AllowUnstable ;
42
+ use rustc_middle:: mir:: interpret:: { LitToConstError , LitToConstInput } ;
42
43
use rustc_middle:: ty:: {
43
44
self , Const , GenericArgKind , GenericArgsRef , GenericParamDefKind , ParamEnv , Ty , TyCtxt ,
44
45
TypeVisitableExt ,
@@ -2195,15 +2196,64 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
2195
2196
// handled specially and will not descend into this routine.
2196
2197
self . ty_infer ( None , hir_ty. span )
2197
2198
}
2198
- hir:: TyKind :: Pat ( _ty, pat) => match pat. kind {
2199
- hir:: PatKind :: Wild => {
2200
- let err = tcx. dcx ( ) . emit_err ( WildPatTy { span : pat. span } ) ;
2201
- Ty :: new_error ( tcx, err)
2202
- }
2203
- hir:: PatKind :: Range ( _, _, _) => Ty :: new_misc_error ( tcx) ,
2204
- hir:: PatKind :: Err ( e) => Ty :: new_error ( tcx, e) ,
2205
- _ => span_bug ! ( pat. span, "unsupported pattern for pattern type: {pat:#?}" ) ,
2206
- } ,
2199
+ hir:: TyKind :: Pat ( ty, pat) => {
2200
+ let ty = self . lower_ty ( ty) ;
2201
+ let pat_ty = match pat. kind {
2202
+ hir:: PatKind :: Wild => {
2203
+ let err = tcx. dcx ( ) . emit_err ( WildPatTy { span : pat. span } ) ;
2204
+ Ty :: new_error ( tcx, err)
2205
+ }
2206
+ hir:: PatKind :: Range ( start, end, include_end) => {
2207
+ let expr_to_const = |expr : & ' tcx hir:: Expr < ' tcx > | -> ty:: Const < ' tcx > {
2208
+ let ( expr, neg) = match expr. kind {
2209
+ hir:: ExprKind :: Unary ( hir:: UnOp :: Neg , negated) => {
2210
+ ( negated, Some ( ( expr. hir_id , expr. span ) ) )
2211
+ }
2212
+ _ => ( expr, None ) ,
2213
+ } ;
2214
+ let c = match & expr. kind {
2215
+ hir:: ExprKind :: Lit ( lit) => {
2216
+ let lit_input =
2217
+ LitToConstInput { lit : & lit. node , ty, neg : neg. is_some ( ) } ;
2218
+ match tcx. lit_to_const ( lit_input) {
2219
+ Ok ( c) => c,
2220
+ Err ( LitToConstError :: Reported ( err) ) => {
2221
+ ty:: Const :: new_error ( tcx, err, ty)
2222
+ }
2223
+ Err ( LitToConstError :: TypeError ) => todo ! ( ) ,
2224
+ }
2225
+ }
2226
+ _ => {
2227
+ let err = tcx
2228
+ . dcx ( )
2229
+ . emit_err ( crate :: errors:: NonConstRange { span : expr. span } ) ;
2230
+ ty:: Const :: new_error ( tcx, err, ty)
2231
+ }
2232
+ } ;
2233
+ self . record_ty ( expr. hir_id , c. ty ( ) , expr. span ) ;
2234
+ if let Some ( ( id, span) ) = neg {
2235
+ self . record_ty ( id, c. ty ( ) , span) ;
2236
+ }
2237
+ c
2238
+ } ;
2239
+
2240
+ let start = start. map ( expr_to_const) ;
2241
+ let end = end. map ( expr_to_const) ;
2242
+
2243
+ let include_end = match include_end {
2244
+ hir:: RangeEnd :: Included => true ,
2245
+ hir:: RangeEnd :: Excluded => false ,
2246
+ } ;
2247
+
2248
+ let pat = tcx. mk_pat ( ty:: PatternKind :: Range { start, end, include_end } ) ;
2249
+ Ty :: new_pat ( tcx, ty, pat)
2250
+ }
2251
+ hir:: PatKind :: Err ( e) => Ty :: new_error ( tcx, e) ,
2252
+ _ => span_bug ! ( pat. span, "unsupported pattern for pattern type: {pat:#?}" ) ,
2253
+ } ;
2254
+ self . record_ty ( pat. hir_id , ty, pat. span ) ;
2255
+ pat_ty
2256
+ }
2207
2257
hir:: TyKind :: Err ( guar) => Ty :: new_error ( tcx, * guar) ,
2208
2258
} ;
2209
2259
0 commit comments