Skip to content

Commit 2119c1f

Browse files
committed
Fix using incorrect type for variants in DefWithBody::body_type
1 parent b25f0ba commit 2119c1f

File tree

4 files changed

+25
-18
lines changed

4 files changed

+25
-18
lines changed

crates/hir-def/src/adt.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,13 @@ impl EnumData {
219219
let (id, _) = self.variants.iter().find(|(_id, data)| &data.name == name)?;
220220
Some(id)
221221
}
222+
223+
pub fn variant_body_type(&self) -> Either<BuiltinInt, BuiltinUint> {
224+
match self.repr {
225+
Some(ReprData { kind: ReprKind::BuiltinInt { builtin, .. }, .. }) => builtin,
226+
_ => Either::Right(BuiltinUint::U32),
227+
}
228+
}
222229
}
223230

224231
impl HasChildSource<LocalEnumVariantId> for EnumId {

crates/hir-ty/src/db.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ use arrayvec::ArrayVec;
77
use base_db::{impl_intern_key, salsa, CrateId, Upcast};
88
use hir_def::{
99
db::DefDatabase, expr::ExprId, BlockId, ConstId, ConstParamId, DefWithBodyId, EnumVariantId,
10-
FunctionId, GenericDefId, ImplId, LifetimeParamId, LocalFieldId, Lookup, TypeOrConstParamId,
11-
VariantId,
10+
FunctionId, GenericDefId, ImplId, LifetimeParamId, LocalFieldId, TypeOrConstParamId, VariantId,
1211
};
1312
use la_arena::ArenaMap;
1413

@@ -194,11 +193,7 @@ fn infer_wait(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult>
194193
db.const_data(it).name.clone().unwrap_or_else(Name::missing).to_string()
195194
}
196195
DefWithBodyId::VariantId(it) => {
197-
let up_db: &dyn DefDatabase = db.upcast();
198-
let loc = it.parent.lookup(up_db);
199-
let item_tree = loc.id.item_tree(up_db);
200-
let konst = &item_tree[loc.id.value];
201-
konst.name.to_string()
196+
db.enum_data(it.parent).variants[it.local_id].name.to_string()
202197
}
203198
});
204199
db.infer_query(def)

crates/hir-ty/src/infer.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use std::sync::Arc;
1818

1919
use chalk_ir::{cast::Cast, ConstValue, DebruijnIndex, Mutability, Safety, Scalar, TypeFlags};
2020
use hir_def::{
21-
adt::{ReprData, ReprKind},
2221
body::Body,
2322
builtin_type::BuiltinType,
2423
data::{ConstData, StaticData},
@@ -70,15 +69,10 @@ pub(crate) fn infer_query(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<Infer
7069
DefWithBodyId::FunctionId(f) => ctx.collect_fn(f),
7170
DefWithBodyId::StaticId(s) => ctx.collect_static(&db.static_data(s)),
7271
DefWithBodyId::VariantId(v) => {
73-
ctx.return_ty = match db.enum_data(v.parent).repr {
74-
Some(ReprData { kind: ReprKind::BuiltinInt { builtin, .. }, .. }) => {
75-
TyBuilder::builtin(match builtin {
76-
Either::Left(builtin) => BuiltinType::Int(builtin),
77-
Either::Right(builtin) => BuiltinType::Uint(builtin),
78-
})
79-
}
80-
_ => TyBuilder::builtin(BuiltinType::Uint(hir_def::builtin_type::BuiltinUint::U32)),
81-
};
72+
ctx.return_ty = TyBuilder::builtin(match db.enum_data(v.parent).variant_body_type() {
73+
Either::Left(builtin) => BuiltinType::Int(builtin),
74+
Either::Right(builtin) => BuiltinType::Uint(builtin),
75+
});
8276
}
8377
}
8478

crates/hir/src/lib.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,17 @@ impl Enum {
953953
Type::from_def(db, self.id)
954954
}
955955

956+
/// The type of the enum variant bodies.
957+
pub fn variant_body_ty(self, db: &dyn HirDatabase) -> Type {
958+
Type::new_for_crate(
959+
self.id.lookup(db.upcast()).container.krate(),
960+
TyBuilder::builtin(match db.enum_data(self.id).variant_body_type() {
961+
Either::Left(builtin) => hir_def::builtin_type::BuiltinType::Int(builtin),
962+
Either::Right(builtin) => hir_def::builtin_type::BuiltinType::Uint(builtin),
963+
}),
964+
)
965+
}
966+
956967
pub fn is_data_carrying(self, db: &dyn HirDatabase) -> bool {
957968
self.variants(db).iter().any(|v| !matches!(v.kind(db), StructKind::Unit))
958969
}
@@ -1176,7 +1187,7 @@ impl DefWithBody {
11761187
DefWithBody::Function(it) => it.ret_type(db),
11771188
DefWithBody::Static(it) => it.ty(db),
11781189
DefWithBody::Const(it) => it.ty(db),
1179-
DefWithBody::Variant(it) => it.parent.ty(db),
1190+
DefWithBody::Variant(it) => it.parent.variant_body_ty(db),
11801191
}
11811192
}
11821193

0 commit comments

Comments
 (0)