use syntax::ast::RangeOp;
use crate::{
- autoderef, dummy_usize_const,
+ autoderef, consteval,
lower::lower_to_chalk_mutability,
mapping::from_chalk,
method_resolution, op,
_ => self.table.new_type_var(),
};
- match array {
+ let len = match array {
Array::ElementList(items) => {
for expr in items.iter() {
self.infer_expr_coerce(*expr, &Expectation::has_type(elem_ty.clone()));
}
+ Some(items.len() as u64)
}
Array::Repeat { initializer, repeat } => {
self.infer_expr_coerce(
TyKind::Scalar(Scalar::Uint(UintTy::Usize)).intern(&Interner),
),
);
+
+ let repeat_expr = &self.body.exprs[*repeat];
+ consteval::eval_usize(repeat_expr)
}
- }
+ };
- TyKind::Array(elem_ty, dummy_usize_const()).intern(&Interner)
+ TyKind::Array(elem_ty, consteval::usize_const(len)).intern(&Interner)
}
Expr::Literal(lit) => match lit {
Literal::Bool(..) => TyKind::Scalar(Scalar::Bool).intern(&Interner),
TyKind::Ref(Mutability::Not, static_lifetime(), TyKind::Str.intern(&Interner))
.intern(&Interner)
}
- Literal::ByteString(..) => {
+ Literal::ByteString(bs) => {
let byte_type = TyKind::Scalar(Scalar::Uint(UintTy::U8)).intern(&Interner);
- let array_type =
- TyKind::Array(byte_type, dummy_usize_const()).intern(&Interner);
+
+ let len = consteval::usize_const(Some(bs.len() as u64));
+
+ let array_type = TyKind::Array(byte_type, len).intern(&Interner);
TyKind::Ref(Mutability::Not, static_lifetime(), array_type).intern(&Interner)
}
Literal::Char(..) => TyKind::Scalar(Scalar::Char).intern(&Interner),
let ty = self.resolve_ty_as_possible(ty);
self.infer_pat(*pat, &ty, BindingMode::default());
}
- Statement::Expr(expr) => {
+ Statement::Expr { expr, .. } => {
self.infer_expr(*expr, &Expectation::none());
}
}