check that first arg to panic!() in const is &str

This commit is contained in:
Austin Bonander 2021-01-05 13:54:28 -08:00
parent da305a2b00
commit 5a33f531cd
8 changed files with 114 additions and 6 deletions

View file

@ -796,7 +796,7 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
self.super_terminator(terminator, location);
match &terminator.kind {
TerminatorKind::Call { func, .. } => {
TerminatorKind::Call { func, args, .. } => {
let ConstCx { tcx, body, param_env, .. } = *self.ccx;
let caller = self.def_id().to_def_id();
@ -857,9 +857,17 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
}
// At this point, we are calling a function, `callee`, whose `DefId` is known...
if is_lang_panic_fn(tcx, callee) {
self.check_op(ops::Panic);
// const-eval of the `begin_panic` fn assumes the argument is `&str`
if Some(callee) == tcx.lang_items().begin_panic_fn() {
match args[0].ty(&self.ccx.body.local_decls, tcx).kind() {
ty::Ref(_, ty, _) if ty.is_str() => (),
_ => self.check_op(ops::PanicNonStr),
}
}
return;
}