adding habdler for tuples with known type
Signed-off-by: Jakub Doka <jakub.doka2@gmail.com>
This commit is contained in:
parent
f59c0c1092
commit
4b3b6af70e
|
@ -1151,9 +1151,11 @@ impl<'a> Codegen<'a> {
|
||||||
|
|
||||||
Some(Value::new(self.gen_null_check(cmped, ty, op)).ty(ty::Id::BOOL))
|
Some(Value::new(self.gen_null_check(cmped, ty, op)).ty(ty::Id::BOOL))
|
||||||
}
|
}
|
||||||
Expr::BinOp { left, pos, op, right }
|
Expr::BinOp { left, pos, op, right } => {
|
||||||
if !matches!(op, TokenKind::Assign | TokenKind::Decl) =>
|
debug_assert!(!matches!(
|
||||||
{
|
op,
|
||||||
|
TokenKind::Assign | TokenKind::Decl | TokenKind::Colon
|
||||||
|
));
|
||||||
let mut lhs = self.ptr_expr_ctx(left, ctx)?;
|
let mut lhs = self.ptr_expr_ctx(left, ctx)?;
|
||||||
self.implicit_unwrap(left.pos(), &mut lhs);
|
self.implicit_unwrap(left.pos(), &mut lhs);
|
||||||
|
|
||||||
|
@ -1768,6 +1770,25 @@ impl<'a> Codegen<'a> {
|
||||||
|
|
||||||
Some(Value::ptr(mem).ty(aty))
|
Some(Value::ptr(mem).ty(aty))
|
||||||
}
|
}
|
||||||
|
(Some(ty::Kind::Tuple(tupl)), ListKind::Tuple) => {
|
||||||
|
let mem = self.new_stack(pos, tupl.into());
|
||||||
|
let mut offs = OffsetIter::new(tupl, self.tys);
|
||||||
|
for field in fields {
|
||||||
|
let Some((ty, offset)) = offs.next_ty(self.tys) else {
|
||||||
|
self.error(
|
||||||
|
field.pos(),
|
||||||
|
"this init argumen overflows the field count",
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
let value = self.checked_expr(field, ty, "tuple field")?;
|
||||||
|
let mem = self.offset(mem, offset);
|
||||||
|
self.store_mem(mem, ty, value.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(Value::ptr(mem).ty(tupl.into()))
|
||||||
|
}
|
||||||
(Some(t), ListKind::Tuple) => self.error(
|
(Some(t), ListKind::Tuple) => self.error(
|
||||||
pos,
|
pos,
|
||||||
fa!(
|
fa!(
|
||||||
|
|
Loading…
Reference in a new issue