Clean up handling of int/float literal types
'Unknown' int/float types actually never exist as such, they get replaced by type variables immediately. So the whole `Uncertain<IntTy>` thing was unnecessary and just led to a bunch of match branches that were never hit.
This commit is contained in:
parent
a609336d72
commit
d66daee849
@ -39,8 +39,7 @@
|
|||||||
use super::{
|
use super::{
|
||||||
primitive::{FloatTy, IntTy},
|
primitive::{FloatTy, IntTy},
|
||||||
traits::{Guidance, Obligation, ProjectionPredicate, Solution},
|
traits::{Guidance, Obligation, ProjectionPredicate, Solution},
|
||||||
ApplicationTy, InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor,
|
InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor, TypeWalk,
|
||||||
TypeWalk, Uncertain,
|
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode,
|
db::HirDatabase, infer::diagnostics::InferenceDiagnostic, lower::ImplTraitLoweringMode,
|
||||||
@ -312,12 +311,6 @@ fn make_ty(&mut self, type_ref: &TypeRef) -> Ty {
|
|||||||
fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty {
|
fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty {
|
||||||
match ty {
|
match ty {
|
||||||
Ty::Unknown => self.table.new_type_var(),
|
Ty::Unknown => self.table.new_type_var(),
|
||||||
Ty::Apply(ApplicationTy { ctor: TypeCtor::Int(Uncertain::Unknown), .. }) => {
|
|
||||||
self.table.new_integer_var()
|
|
||||||
}
|
|
||||||
Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(Uncertain::Unknown), .. }) => {
|
|
||||||
self.table.new_float_var()
|
|
||||||
}
|
|
||||||
_ => ty,
|
_ => ty,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -664,8 +657,8 @@ fn to_inner(self) -> unify::TypeVarId {
|
|||||||
fn fallback_value(self) -> Ty {
|
fn fallback_value(self) -> Ty {
|
||||||
match self {
|
match self {
|
||||||
InferTy::TypeVar(..) => Ty::Unknown,
|
InferTy::TypeVar(..) => Ty::Unknown,
|
||||||
InferTy::IntVar(..) => Ty::simple(TypeCtor::Int(Uncertain::Known(IntTy::i32()))),
|
InferTy::IntVar(..) => Ty::simple(TypeCtor::Int(IntTy::i32())),
|
||||||
InferTy::FloatVar(..) => Ty::simple(TypeCtor::Float(Uncertain::Known(FloatTy::f64()))),
|
InferTy::FloatVar(..) => Ty::simple(TypeCtor::Float(FloatTy::f64())),
|
||||||
InferTy::MaybeNeverTypeVar(..) => Ty::simple(TypeCtor::Never),
|
InferTy::MaybeNeverTypeVar(..) => Ty::simple(TypeCtor::Never),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
traits::InEnvironment,
|
traits::InEnvironment,
|
||||||
utils::{generics, variant_data, Generics},
|
utils::{generics, variant_data, Generics},
|
||||||
ApplicationTy, Binders, CallableDef, InferTy, IntTy, Mutability, Obligation, Rawness, Substs,
|
ApplicationTy, Binders, CallableDef, InferTy, IntTy, Mutability, Obligation, Rawness, Substs,
|
||||||
TraitRef, Ty, TypeCtor, Uncertain,
|
TraitRef, Ty, TypeCtor,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
@ -426,15 +426,7 @@ fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
|
|||||||
match &inner_ty {
|
match &inner_ty {
|
||||||
// Fast path for builtins
|
// Fast path for builtins
|
||||||
Ty::Apply(ApplicationTy {
|
Ty::Apply(ApplicationTy {
|
||||||
ctor:
|
ctor: TypeCtor::Int(IntTy { signedness: Signedness::Signed, .. }),
|
||||||
TypeCtor::Int(Uncertain::Known(IntTy {
|
|
||||||
signedness: Signedness::Signed,
|
|
||||||
..
|
|
||||||
})),
|
|
||||||
..
|
|
||||||
})
|
|
||||||
| Ty::Apply(ApplicationTy {
|
|
||||||
ctor: TypeCtor::Int(Uncertain::Unknown),
|
|
||||||
..
|
..
|
||||||
})
|
})
|
||||||
| Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(_), .. })
|
| Ty::Apply(ApplicationTy { ctor: TypeCtor::Float(_), .. })
|
||||||
@ -577,9 +569,7 @@ fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
|
|||||||
);
|
);
|
||||||
self.infer_expr(
|
self.infer_expr(
|
||||||
*repeat,
|
*repeat,
|
||||||
&Expectation::has_type(Ty::simple(TypeCtor::Int(Uncertain::Known(
|
&Expectation::has_type(Ty::simple(TypeCtor::Int(IntTy::usize()))),
|
||||||
IntTy::usize(),
|
|
||||||
)))),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -592,13 +582,19 @@ fn infer_expr_inner(&mut self, tgt_expr: ExprId, expected: &Expectation) -> Ty {
|
|||||||
Ty::apply_one(TypeCtor::Ref(Mutability::Shared), Ty::simple(TypeCtor::Str))
|
Ty::apply_one(TypeCtor::Ref(Mutability::Shared), Ty::simple(TypeCtor::Str))
|
||||||
}
|
}
|
||||||
Literal::ByteString(..) => {
|
Literal::ByteString(..) => {
|
||||||
let byte_type = Ty::simple(TypeCtor::Int(Uncertain::Known(IntTy::u8())));
|
let byte_type = Ty::simple(TypeCtor::Int(IntTy::u8()));
|
||||||
let array_type = Ty::apply_one(TypeCtor::Array, byte_type);
|
let array_type = Ty::apply_one(TypeCtor::Array, byte_type);
|
||||||
Ty::apply_one(TypeCtor::Ref(Mutability::Shared), array_type)
|
Ty::apply_one(TypeCtor::Ref(Mutability::Shared), array_type)
|
||||||
}
|
}
|
||||||
Literal::Char(..) => Ty::simple(TypeCtor::Char),
|
Literal::Char(..) => Ty::simple(TypeCtor::Char),
|
||||||
Literal::Int(_v, ty) => Ty::simple(TypeCtor::Int((*ty).into())),
|
Literal::Int(_v, ty) => match ty {
|
||||||
Literal::Float(_v, ty) => Ty::simple(TypeCtor::Float((*ty).into())),
|
Some(int_ty) => Ty::simple(TypeCtor::Int((*int_ty).into())),
|
||||||
|
None => self.table.new_integer_var(),
|
||||||
|
},
|
||||||
|
Literal::Float(_v, ty) => match ty {
|
||||||
|
Some(float_ty) => Ty::simple(TypeCtor::Float((*float_ty).into())),
|
||||||
|
None => self.table.new_float_var(),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
// use a new type variable if we got Ty::Unknown here
|
// use a new type variable if we got Ty::Unknown here
|
||||||
|
@ -58,7 +58,7 @@ fn from(it: $sv) -> $e {
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
primitive::{FloatTy, IntTy, Uncertain},
|
primitive::{FloatTy, IntTy},
|
||||||
utils::{generics, make_mut_slice, Generics},
|
utils::{generics, make_mut_slice, Generics},
|
||||||
};
|
};
|
||||||
use display::HirDisplay;
|
use display::HirDisplay;
|
||||||
@ -87,10 +87,10 @@ pub enum TypeCtor {
|
|||||||
Char,
|
Char,
|
||||||
|
|
||||||
/// A primitive integer type. For example, `i32`.
|
/// A primitive integer type. For example, `i32`.
|
||||||
Int(Uncertain<IntTy>),
|
Int(IntTy),
|
||||||
|
|
||||||
/// A primitive floating-point type. For example, `f64`.
|
/// A primitive floating-point type. For example, `f64`.
|
||||||
Float(Uncertain<FloatTy>),
|
Float(FloatTy),
|
||||||
|
|
||||||
/// Structures, enumerations and unions.
|
/// Structures, enumerations and unions.
|
||||||
Adt(AdtId),
|
Adt(AdtId),
|
||||||
|
@ -16,12 +16,8 @@
|
|||||||
|
|
||||||
use super::Substs;
|
use super::Substs;
|
||||||
use crate::{
|
use crate::{
|
||||||
autoderef,
|
autoderef, db::HirDatabase, primitive::FloatBitness, utils::all_super_traits, ApplicationTy,
|
||||||
db::HirDatabase,
|
Canonical, DebruijnIndex, InEnvironment, TraitEnvironment, TraitRef, Ty, TypeCtor, TypeWalk,
|
||||||
primitive::{FloatBitness, Uncertain},
|
|
||||||
utils::all_super_traits,
|
|
||||||
ApplicationTy, Canonical, DebruijnIndex, InEnvironment, TraitEnvironment, TraitRef, Ty,
|
|
||||||
TypeCtor, TypeWalk,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This is used as a key for indexing impls.
|
/// This is used as a key for indexing impls.
|
||||||
@ -147,12 +143,12 @@ macro_rules! lang_item_crate {
|
|||||||
}
|
}
|
||||||
TypeCtor::Bool => lang_item_crate!("bool"),
|
TypeCtor::Bool => lang_item_crate!("bool"),
|
||||||
TypeCtor::Char => lang_item_crate!("char"),
|
TypeCtor::Char => lang_item_crate!("char"),
|
||||||
TypeCtor::Float(Uncertain::Known(f)) => match f.bitness {
|
TypeCtor::Float(f) => match f.bitness {
|
||||||
// There are two lang items: one in libcore (fXX) and one in libstd (fXX_runtime)
|
// There are two lang items: one in libcore (fXX) and one in libstd (fXX_runtime)
|
||||||
FloatBitness::X32 => lang_item_crate!("f32", "f32_runtime"),
|
FloatBitness::X32 => lang_item_crate!("f32", "f32_runtime"),
|
||||||
FloatBitness::X64 => lang_item_crate!("f64", "f64_runtime"),
|
FloatBitness::X64 => lang_item_crate!("f64", "f64_runtime"),
|
||||||
},
|
},
|
||||||
TypeCtor::Int(Uncertain::Known(i)) => lang_item_crate!(i.ty_to_string()),
|
TypeCtor::Int(i) => lang_item_crate!(i.ty_to_string()),
|
||||||
TypeCtor::Str => lang_item_crate!("str_alloc", "str"),
|
TypeCtor::Str => lang_item_crate!("str_alloc", "str"),
|
||||||
TypeCtor::Slice => lang_item_crate!("slice_alloc", "slice"),
|
TypeCtor::Slice => lang_item_crate!("slice_alloc", "slice"),
|
||||||
TypeCtor::RawPtr(Mutability::Shared) => lang_item_crate!("const_ptr"),
|
TypeCtor::RawPtr(Mutability::Shared) => lang_item_crate!("const_ptr"),
|
||||||
|
@ -7,42 +7,6 @@
|
|||||||
|
|
||||||
pub use hir_def::builtin_type::{BuiltinFloat, BuiltinInt, FloatBitness, IntBitness, Signedness};
|
pub use hir_def::builtin_type::{BuiltinFloat, BuiltinInt, FloatBitness, IntBitness, Signedness};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Eq, PartialEq, Hash, Debug)]
|
|
||||||
pub enum Uncertain<T> {
|
|
||||||
Unknown,
|
|
||||||
Known(T),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<IntTy> for Uncertain<IntTy> {
|
|
||||||
fn from(ty: IntTy) -> Self {
|
|
||||||
Uncertain::Known(ty)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Uncertain<IntTy> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match *self {
|
|
||||||
Uncertain::Unknown => write!(f, "{{integer}}"),
|
|
||||||
Uncertain::Known(ty) => write!(f, "{}", ty),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<FloatTy> for Uncertain<FloatTy> {
|
|
||||||
fn from(ty: FloatTy) -> Self {
|
|
||||||
Uncertain::Known(ty)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Uncertain<FloatTy> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match *self {
|
|
||||||
Uncertain::Unknown => write!(f, "{{float}}"),
|
|
||||||
Uncertain::Known(ty) => write!(f, "{}", ty),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
||||||
pub struct IntTy {
|
pub struct IntTy {
|
||||||
pub signedness: Signedness,
|
pub signedness: Signedness,
|
||||||
@ -173,21 +137,3 @@ fn from(t: BuiltinFloat) -> Self {
|
|||||||
FloatTy { bitness: t.bitness }
|
FloatTy { bitness: t.bitness }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Option<BuiltinInt>> for Uncertain<IntTy> {
|
|
||||||
fn from(t: Option<BuiltinInt>) -> Self {
|
|
||||||
match t {
|
|
||||||
None => Uncertain::Unknown,
|
|
||||||
Some(t) => Uncertain::Known(t.into()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Option<BuiltinFloat>> for Uncertain<FloatTy> {
|
|
||||||
fn from(t: Option<BuiltinFloat>) -> Self {
|
|
||||||
match t {
|
|
||||||
None => Uncertain::Unknown,
|
|
||||||
Some(t) => Uncertain::Known(t.into()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness, Uncertain},
|
primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness},
|
||||||
traits::{builtin, AssocTyValue, Canonical, Impl, Obligation},
|
traits::{builtin, AssocTyValue, Canonical, Impl, Obligation},
|
||||||
ApplicationTy, CallableDef, GenericPredicate, InEnvironment, OpaqueTy, OpaqueTyId,
|
ApplicationTy, CallableDef, GenericPredicate, InEnvironment, OpaqueTy, OpaqueTyId,
|
||||||
ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor,
|
ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef, Ty, TypeCtor,
|
||||||
@ -249,11 +249,11 @@ fn to_chalk(self, db: &dyn HirDatabase) -> TypeName<Interner> {
|
|||||||
|
|
||||||
TypeCtor::Bool => TypeName::Scalar(Scalar::Bool),
|
TypeCtor::Bool => TypeName::Scalar(Scalar::Bool),
|
||||||
TypeCtor::Char => TypeName::Scalar(Scalar::Char),
|
TypeCtor::Char => TypeName::Scalar(Scalar::Char),
|
||||||
TypeCtor::Int(Uncertain::Known(int_ty)) => TypeName::Scalar(int_ty_to_chalk(int_ty)),
|
TypeCtor::Int(int_ty) => TypeName::Scalar(int_ty_to_chalk(int_ty)),
|
||||||
TypeCtor::Float(Uncertain::Known(FloatTy { bitness: FloatBitness::X32 })) => {
|
TypeCtor::Float(FloatTy { bitness: FloatBitness::X32 }) => {
|
||||||
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F32))
|
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F32))
|
||||||
}
|
}
|
||||||
TypeCtor::Float(Uncertain::Known(FloatTy { bitness: FloatBitness::X64 })) => {
|
TypeCtor::Float(FloatTy { bitness: FloatBitness::X64 }) => {
|
||||||
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F64))
|
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F64))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -268,9 +268,7 @@ fn to_chalk(self, db: &dyn HirDatabase) -> TypeName<Interner> {
|
|||||||
}
|
}
|
||||||
TypeCtor::Never => TypeName::Never,
|
TypeCtor::Never => TypeName::Never,
|
||||||
|
|
||||||
TypeCtor::Int(Uncertain::Unknown)
|
TypeCtor::Adt(_)
|
||||||
| TypeCtor::Float(Uncertain::Unknown)
|
|
||||||
| TypeCtor::Adt(_)
|
|
||||||
| TypeCtor::Array
|
| TypeCtor::Array
|
||||||
| TypeCtor::FnPtr { .. }
|
| TypeCtor::FnPtr { .. }
|
||||||
| TypeCtor::Closure { .. } => {
|
| TypeCtor::Closure { .. } => {
|
||||||
@ -291,19 +289,19 @@ fn from_chalk(db: &dyn HirDatabase, type_name: TypeName<Interner>) -> TypeCtor {
|
|||||||
|
|
||||||
TypeName::Scalar(Scalar::Bool) => TypeCtor::Bool,
|
TypeName::Scalar(Scalar::Bool) => TypeCtor::Bool,
|
||||||
TypeName::Scalar(Scalar::Char) => TypeCtor::Char,
|
TypeName::Scalar(Scalar::Char) => TypeCtor::Char,
|
||||||
TypeName::Scalar(Scalar::Int(int_ty)) => TypeCtor::Int(Uncertain::Known(IntTy {
|
TypeName::Scalar(Scalar::Int(int_ty)) => TypeCtor::Int(IntTy {
|
||||||
signedness: Signedness::Signed,
|
signedness: Signedness::Signed,
|
||||||
bitness: bitness_from_chalk_int(int_ty),
|
bitness: bitness_from_chalk_int(int_ty),
|
||||||
})),
|
}),
|
||||||
TypeName::Scalar(Scalar::Uint(uint_ty)) => TypeCtor::Int(Uncertain::Known(IntTy {
|
TypeName::Scalar(Scalar::Uint(uint_ty)) => TypeCtor::Int(IntTy {
|
||||||
signedness: Signedness::Unsigned,
|
signedness: Signedness::Unsigned,
|
||||||
bitness: bitness_from_chalk_uint(uint_ty),
|
bitness: bitness_from_chalk_uint(uint_ty),
|
||||||
})),
|
}),
|
||||||
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F32)) => {
|
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F32)) => {
|
||||||
TypeCtor::Float(Uncertain::Known(FloatTy { bitness: FloatBitness::X32 }))
|
TypeCtor::Float(FloatTy { bitness: FloatBitness::X32 })
|
||||||
}
|
}
|
||||||
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F64)) => {
|
TypeName::Scalar(Scalar::Float(chalk_ir::FloatTy::F64)) => {
|
||||||
TypeCtor::Float(Uncertain::Known(FloatTy { bitness: FloatBitness::X64 }))
|
TypeCtor::Float(FloatTy { bitness: FloatBitness::X64 })
|
||||||
}
|
}
|
||||||
TypeName::Tuple(cardinality) => TypeCtor::Tuple { cardinality: cardinality as u16 },
|
TypeName::Tuple(cardinality) => TypeCtor::Tuple { cardinality: cardinality as u16 },
|
||||||
TypeName::Raw(mutability) => TypeCtor::RawPtr(from_chalk(db, mutability)),
|
TypeName::Raw(mutability) => TypeCtor::RawPtr(from_chalk(db, mutability)),
|
||||||
|
Loading…
Reference in New Issue
Block a user