Fix float coersion rules
This commit is contained in:
parent
a1507e14ca
commit
ec0c7fa194
@ -457,6 +457,20 @@ impl Collapsable for TypeKind {
|
|||||||
_ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())),
|
_ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
(TypeKind::Vague(Vague::Decimal), other) | (other, TypeKind::Vague(Vague::Decimal)) => {
|
||||||
|
match other {
|
||||||
|
TypeKind::Vague(Vague::Unknown) => Ok(TypeKind::Vague(Vague::Decimal)),
|
||||||
|
TypeKind::Vague(Vague::Decimal) => Ok(TypeKind::Vague(Vague::Decimal)),
|
||||||
|
TypeKind::F16
|
||||||
|
| TypeKind::F32B
|
||||||
|
| TypeKind::F32
|
||||||
|
| TypeKind::F64
|
||||||
|
| TypeKind::F80
|
||||||
|
| TypeKind::F128
|
||||||
|
| TypeKind::F128PPC => Ok(other.clone()),
|
||||||
|
_ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())),
|
||||||
|
}
|
||||||
|
}
|
||||||
(TypeKind::Vague(Vague::Unknown), other) | (other, TypeKind::Vague(Vague::Unknown)) => {
|
(TypeKind::Vague(Vague::Unknown), other) | (other, TypeKind::Vague(Vague::Unknown)) => {
|
||||||
Ok(other.clone())
|
Ok(other.clone())
|
||||||
}
|
}
|
||||||
|
@ -734,6 +734,13 @@ impl Literal {
|
|||||||
(L::U32(_), TypeKind::U32) => self,
|
(L::U32(_), TypeKind::U32) => self,
|
||||||
(L::U64(_), TypeKind::U64) => self,
|
(L::U64(_), TypeKind::U64) => self,
|
||||||
(L::U128(_), TypeKind::U128) => self,
|
(L::U128(_), TypeKind::U128) => self,
|
||||||
|
(L::F16(_), TypeKind::F16) => self,
|
||||||
|
(L::F32(_), TypeKind::F32) => self,
|
||||||
|
(L::F32B(_), TypeKind::F32B) => self,
|
||||||
|
(L::F64(_), TypeKind::F64) => self,
|
||||||
|
(L::F80(_), TypeKind::F80) => self,
|
||||||
|
(L::F128(_), TypeKind::F128) => self,
|
||||||
|
(L::F128PPC(_), TypeKind::F128PPC) => self,
|
||||||
(L::Bool(_), TypeKind::Bool) => self,
|
(L::Bool(_), TypeKind::Bool) => self,
|
||||||
(L::String(_), TypeKind::StringPtr) => self,
|
(L::String(_), TypeKind::StringPtr) => self,
|
||||||
// TODO make sure that v is actually able to fit in the
|
// TODO make sure that v is actually able to fit in the
|
||||||
@ -748,6 +755,13 @@ impl Literal {
|
|||||||
(L::Vague(VagueL::Number(v)), TypeKind::U32) => L::U32(v as u32),
|
(L::Vague(VagueL::Number(v)), TypeKind::U32) => L::U32(v as u32),
|
||||||
(L::Vague(VagueL::Number(v)), TypeKind::U64) => L::U64(v as u64),
|
(L::Vague(VagueL::Number(v)), TypeKind::U64) => L::U64(v as u64),
|
||||||
(L::Vague(VagueL::Number(v)), TypeKind::U128) => L::U128(v as u128),
|
(L::Vague(VagueL::Number(v)), TypeKind::U128) => L::U128(v as u128),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F16) => L::F16(v as f32),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F32) => L::F32(v as f32),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F32B) => L::F32B(v as f32),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F64) => L::F64(v as f64),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F80) => L::F80(v as f64),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F128) => L::F128(v as f64),
|
||||||
|
(L::Vague(VagueL::Decimal(v)), TypeKind::F128PPC) => L::F128PPC(v as f64),
|
||||||
(_, TypeKind::Vague(_)) => self,
|
(_, TypeKind::Vague(_)) => self,
|
||||||
_ => Err(ErrorKind::LiteralIncompatible(self, hint.clone()))?,
|
_ => Err(ErrorKind::LiteralIncompatible(self, hint.clone()))?,
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user