11//! Type inference for expressions.
22
3- use std:: {
4- convert:: TryInto ,
5- iter:: { repeat, repeat_with} ,
6- } ;
3+ use std:: iter:: { repeat, repeat_with} ;
74use std:: { mem, sync:: Arc } ;
85
9- use chalk_ir:: { cast:: Cast , fold:: Shift , ConstData , Mutability , TyVariableKind } ;
6+ use chalk_ir:: { cast:: Cast , fold:: Shift , Mutability , TyVariableKind } ;
107use hir_def:: {
11- builtin_type:: BuiltinUint ,
128 expr:: { Array , BinaryOp , Expr , ExprId , Literal , Statement , UnaryOp } ,
139 path:: { GenericArg , GenericArgs } ,
1410 resolver:: resolver_for_expr,
15- type_ref:: ConstScalar ,
1611 AssocContainerId , FieldId , Lookup ,
1712} ;
1813use hir_expand:: name:: { name, Name } ;
@@ -21,16 +16,16 @@ use syntax::ast::RangeOp;
2116
2217use crate :: {
2318 autoderef,
19+ consteval:: { self , ExprEval } ,
2420 lower:: lower_to_chalk_mutability,
2521 mapping:: from_chalk,
2622 method_resolution, op,
2723 primitive:: { self , UintTy } ,
2824 static_lifetime, to_chalk_trait_id,
2925 traits:: FnTrait ,
3026 utils:: { generics, Generics } ,
31- AdtId , Binders , CallableDefId , ConcreteConst , ConstValue , FnPointer , FnSig , FnSubst ,
32- InEnvironment , Interner , ProjectionTyExt , Rawness , Scalar , Substitution , TraitRef , Ty ,
33- TyBuilder , TyExt , TyKind ,
27+ AdtId , Binders , CallableDefId , FnPointer , FnSig , FnSubst , InEnvironment , Interner ,
28+ ProjectionTyExt , Rawness , Scalar , Substitution , TraitRef , Ty , TyBuilder , TyExt , TyKind ,
3429} ;
3530
3631use super :: {
@@ -743,25 +738,11 @@ impl<'a> InferenceContext<'a> {
743738 ) ;
744739
745740 let repeat_expr = & self . body . exprs [ * repeat] ;
746- match repeat_expr {
747- Expr :: Literal ( Literal :: Uint ( v, None ) )
748- | Expr :: Literal ( Literal :: Uint ( v, Some ( BuiltinUint :: Usize ) ) ) => {
749- ( * v) . try_into ( ) . ok ( )
750- }
751- _ => None ,
752- }
741+ repeat_expr. eval_usize ( )
753742 }
754743 } ;
755744
756- let cd = ConstData {
757- ty : TyKind :: Scalar ( Scalar :: Uint ( UintTy :: Usize ) ) . intern ( & Interner ) ,
758- value : ConstValue :: Concrete ( chalk_ir:: ConcreteConst {
759- interned : len
760- . map ( |len| ConstScalar :: Usize ( len) )
761- . unwrap_or ( ConstScalar :: Unknown ) ,
762- } ) ,
763- } ;
764- TyKind :: Array ( elem_ty, cd. intern ( & Interner ) ) . intern ( & Interner )
745+ TyKind :: Array ( elem_ty, consteval:: usize_const ( len) ) . intern ( & Interner )
765746 }
766747 Expr :: Literal ( lit) => match lit {
767748 Literal :: Bool ( ..) => TyKind :: Scalar ( Scalar :: Bool ) . intern ( & Interner ) ,
@@ -772,13 +753,7 @@ impl<'a> InferenceContext<'a> {
772753 Literal :: ByteString ( bs) => {
773754 let byte_type = TyKind :: Scalar ( Scalar :: Uint ( UintTy :: U8 ) ) . intern ( & Interner ) ;
774755
775- let len = ConstData {
776- ty : TyKind :: Scalar ( Scalar :: Uint ( UintTy :: Usize ) ) . intern ( & Interner ) ,
777- value : ConstValue :: Concrete ( ConcreteConst {
778- interned : ConstScalar :: Usize ( bs. len ( ) as u64 ) ,
779- } ) ,
780- }
781- . intern ( & Interner ) ;
756+ let len = consteval:: usize_const ( Some ( bs. len ( ) as u64 ) ) ;
782757
783758 let array_type = TyKind :: Array ( byte_type, len) . intern ( & Interner ) ;
784759 TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , array_type) . intern ( & Interner )
0 commit comments