1
1
//! Type inference for expressions.
2
2
3
- use std:: {
4
- convert:: TryInto ,
5
- iter:: { repeat, repeat_with} ,
6
- } ;
3
+ use std:: iter:: { repeat, repeat_with} ;
7
4
use std:: { mem, sync:: Arc } ;
8
5
9
- use chalk_ir:: { cast:: Cast , fold:: Shift , ConstData , Mutability , TyVariableKind } ;
6
+ use chalk_ir:: { cast:: Cast , fold:: Shift , Mutability , TyVariableKind } ;
10
7
use hir_def:: {
11
- builtin_type:: BuiltinUint ,
12
8
expr:: { Array , BinaryOp , Expr , ExprId , Literal , Statement , UnaryOp } ,
13
9
path:: { GenericArg , GenericArgs } ,
14
10
resolver:: resolver_for_expr,
15
- type_ref:: ConstScalar ,
16
11
AssocContainerId , FieldId , Lookup ,
17
12
} ;
18
13
use hir_expand:: name:: { name, Name } ;
@@ -21,16 +16,16 @@ use syntax::ast::RangeOp;
21
16
22
17
use crate :: {
23
18
autoderef,
19
+ consteval:: { self , ExprEval } ,
24
20
lower:: lower_to_chalk_mutability,
25
21
mapping:: from_chalk,
26
22
method_resolution, op,
27
23
primitive:: { self , UintTy } ,
28
24
static_lifetime, to_chalk_trait_id,
29
25
traits:: FnTrait ,
30
26
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 ,
34
29
} ;
35
30
36
31
use super :: {
@@ -743,25 +738,11 @@ impl<'a> InferenceContext<'a> {
743
738
) ;
744
739
745
740
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 ( )
753
742
}
754
743
} ;
755
744
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 )
765
746
}
766
747
Expr :: Literal ( lit) => match lit {
767
748
Literal :: Bool ( ..) => TyKind :: Scalar ( Scalar :: Bool ) . intern ( & Interner ) ,
@@ -772,13 +753,7 @@ impl<'a> InferenceContext<'a> {
772
753
Literal :: ByteString ( bs) => {
773
754
let byte_type = TyKind :: Scalar ( Scalar :: Uint ( UintTy :: U8 ) ) . intern ( & Interner ) ;
774
755
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 ) ) ;
782
757
783
758
let array_type = TyKind :: Array ( byte_type, len) . intern ( & Interner ) ;
784
759
TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , array_type) . intern ( & Interner )
0 commit comments