aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_ty/src/infer/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_ty/src/infer/expr.rs')
-rw-r--r--crates/hir_ty/src/infer/expr.rs22
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;
15use syntax::ast::RangeOp; 15use syntax::ast::RangeOp;
16 16
17use crate::{ 17use 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 }