Fix Inline MIR pass on a function with un-satisfiable bounds

This commit is contained in:
Michael Goulet 2022-01-17 20:38:38 -08:00
parent ee5d8d37ba
commit b651d5a1f4
4 changed files with 35 additions and 2 deletions

View file

@ -7,6 +7,7 @@ use rustc_index::vec::Idx;
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
use rustc_middle::mir::visit::*;
use rustc_middle::mir::*;
use rustc_middle::traits::ObligationCause;
use rustc_middle::ty::subst::Subst;
use rustc_middle::ty::{self, ConstKind, Instance, InstanceDef, ParamEnv, Ty, TyCtxt};
use rustc_span::{hygiene::ExpnKind, ExpnData, Span};
@ -75,10 +76,18 @@ fn inline<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> bool {
return false;
}
let param_env = tcx.param_env_reveal_all_normalized(def_id);
let param_env = rustc_trait_selection::traits::normalize_param_env_or_error(
tcx,
def_id,
param_env,
ObligationCause::misc(body.span, hir_id),
);
let mut this = Inliner {
tcx,
param_env: tcx.param_env_reveal_all_normalized(body.source.def_id()),
codegen_fn_attrs: tcx.codegen_fn_attrs(body.source.def_id()),
param_env,
codegen_fn_attrs: tcx.codegen_fn_attrs(def_id),
hir_id,
history: Vec::new(),
changed: false,

View file

@ -65,6 +65,8 @@ pub fn codegen_fulfill_obligation<'tcx>(
Err(Unimplemented) => {
// This can trigger when we probe for the source of a `'static` lifetime requirement
// on a trait object: `impl Foo for dyn Trait {}` has an implicit `'static` bound.
// This can also trigger when we have a global bound that is not actually satisfied,
// but was included during typeck due to the trivial_bounds feature.
infcx.tcx.sess.delay_span_bug(
rustc_span::DUMMY_SP,
&format!(

View file

@ -0,0 +1,10 @@
// compile-flags: -Zmir-opt-level=4
pub fn bar<T>(s: &'static mut ())
where
&'static mut (): Clone, //~ ERROR the trait bound
{
<&'static mut () as Clone>::clone(&s);
}
fn main() {}

View file

@ -0,0 +1,12 @@
error[E0277]: the trait bound `&'static mut (): Clone` is not satisfied
--> $DIR/issue-93008.rs:5:5
|
LL | &'static mut (): Clone,
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `&'static mut ()`
|
= help: see issue #48214
= help: add `#![feature(trivial_bounds)]` to the crate attributes to enable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.