Check type of const param correctly in MIR typeck

This commit is contained in:
Michael Goulet
2025-03-09 19:32:51 +00:00
parent cbfdf0b014
commit 0160c60c78
6 changed files with 99 additions and 0 deletions

View File

@@ -1773,6 +1773,22 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
{
span_mirbug!(self, constant, "bad static type {:?} ({:?})", constant, terr);
}
} else if let Const::Ty(_, ct) = constant.const_
&& let ty::ConstKind::Param(p) = ct.kind()
{
let body_def_id = self.universal_regions.defining_ty.def_id();
let const_param = tcx.generics_of(body_def_id).const_param(p, tcx);
self.ascribe_user_type(
constant.const_.ty(),
ty::UserType::new(ty::UserTypeKind::TypeOf(
const_param.def_id,
UserArgs {
args: self.universal_regions.defining_ty.args(),
user_self_ty: None,
},
)),
locations.span(self.body),
);
}
if let ty::FnDef(def_id, args) = *constant.const_.ty().kind() {

View File

@@ -184,6 +184,20 @@ impl<'tcx> DefiningTy<'tcx> {
| DefiningTy::GlobalAsm(def_id) => def_id,
}
}
/// Returns the args of the `DefiningTy`. These are equivalent to the identity
/// substs of the body, but replaced with region vids.
pub(crate) fn args(&self) -> ty::GenericArgsRef<'tcx> {
match *self {
DefiningTy::Closure(_, args)
| DefiningTy::Coroutine(_, args)
| DefiningTy::CoroutineClosure(_, args)
| DefiningTy::FnDef(_, args)
| DefiningTy::Const(_, args)
| DefiningTy::InlineConst(_, args) => args,
DefiningTy::GlobalAsm(_) => ty::List::empty(),
}
}
}
#[derive(Debug)]