diff options
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 50497eecb..b6b5a1b75 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -15,7 +15,7 @@ use stdx::always; | |||
15 | use syntax::ast::RangeOp; | 15 | use syntax::ast::RangeOp; |
16 | 16 | ||
17 | use crate::{ | 17 | use crate::{ |
18 | autoderef, dummy_usize_const, | 18 | autoderef, consteval, |
19 | lower::lower_to_chalk_mutability, | 19 | lower::lower_to_chalk_mutability, |
20 | mapping::from_chalk, | 20 | mapping::from_chalk, |
21 | method_resolution, op, | 21 | method_resolution, op, |
@@ -717,11 +717,12 @@ impl<'a> InferenceContext<'a> { | |||
717 | _ => self.table.new_type_var(), | 717 | _ => self.table.new_type_var(), |
718 | }; | 718 | }; |
719 | 719 | ||
720 | match array { | 720 | let len = match array { |
721 | Array::ElementList(items) => { | 721 | Array::ElementList(items) => { |
722 | for expr in items.iter() { | 722 | for expr in items.iter() { |
723 | self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone())); | 723 | self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone())); |
724 | } | 724 | } |
725 | Some(items.len() as u64) | ||
725 | } | 726 | } |
726 | Array::Repeat { initializer, repeat } => { | 727 | Array::Repeat { initializer, repeat } => { |
727 | self.infer_expr_coerce( | 728 | self.infer_expr_coerce( |
@@ -734,10 +735,13 @@ impl<'a> InferenceContext<'a> { | |||
734 | TyKind::Scalar(Scalar::Uint(UintTy::Usize)).intern(&Interner), | 735 | TyKind::Scalar(Scalar::Uint(UintTy::Usize)).intern(&Interner), |
735 | ), | 736 | ), |
736 | ); | 737 | ); |
738 | |||
739 | let repeat_expr = &self.body.exprs[*repeat]; | ||
740 | consteval::eval_usize(repeat_expr) | ||
737 | } | 741 | } |
738 | } | 742 | }; |
739 | 743 | ||
740 | TyKind::Array(elem_ty, dummy_usize_const()).intern(&Interner) | 744 | TyKind::Array(elem_ty, consteval::usize_const(len)).intern(&Interner) |
741 | } | 745 | } |
742 | Expr::Literal(lit) => match lit { | 746 | Expr::Literal(lit) => match lit { |
743 | Literal::Bool(..) => TyKind::Scalar(Scalar::Bool).intern(&Interner), | 747 | Literal::Bool(..) => TyKind::Scalar(Scalar::Bool).intern(&Interner), |
@@ -745,10 +749,12 @@ impl<'a> InferenceContext<'a> { | |||
745 | TyKind::Ref(Mutability::Not, static_lifetime(), TyKind::Str.intern(&Interner)) | 749 | TyKind::Ref(Mutability::Not, static_lifetime(), TyKind::Str.intern(&Interner)) |
746 | .intern(&Interner) | 750 | .intern(&Interner) |
747 | } | 751 | } |
748 | Literal::ByteString(..) => { | 752 | Literal::ByteString(bs) => { |
749 | let byte_type = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(&Interner); | 753 | let byte_type = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(&Interner); |
750 | let array_type = | 754 | |
751 | TyKind::Array(byte_type, dummy_usize_const()).intern(&Interner); | 755 | let len = consteval::usize_const(Some(bs.len() as u64)); |
756 | |||
757 | let array_type = TyKind::Array(byte_type, len).intern(&Interner); | ||
752 | TyKind::Ref(Mutability::Not, static_lifetime(), array_type).intern(&Interner) | 758 | TyKind::Ref(Mutability::Not, static_lifetime(), array_type).intern(&Interner) |
753 | } | 759 | } |
754 | Literal::Char(..) => TyKind::Scalar(Scalar::Char).intern(&Interner), | 760 | Literal::Char(..) => TyKind::Scalar(Scalar::Char).intern(&Interner), |
@@ -809,7 +815,7 @@ impl<'a> InferenceContext<'a> { | |||
809 | let ty = self.resolve_ty_as_possible(ty); | 815 | let ty = self.resolve_ty_as_possible(ty); |
810 | self.infer_pat(*pat, &ty, BindingMode::default()); | 816 | self.infer_pat(*pat, &ty, BindingMode::default()); |
811 | } | 817 | } |
812 | Statement::Expr(expr) => { | 818 | Statement::Expr { expr, .. } => { |
813 | self.infer_expr(*expr, &Expectation::none()); | 819 | self.infer_expr(*expr, &Expectation::none()); |
814 | } | 820 | } |
815 | } | 821 | } |