Unconditionally run RevealAll pass and run it earlier

This commit is contained in:
Oli Scherer 2023-09-11 15:00:46 +00:00
parent ec6f554536
commit f5df26dbec
8 changed files with 80 additions and 26 deletions

View File

@ -480,6 +480,7 @@ fn run_runtime_lowering_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
let passes: &[&dyn MirPass<'tcx>] = &[
// These next passes must be executed together
&add_call_guards::CriticalCallEdges,
&reveal_all::RevealAll, // has to be done before drop elaboration, since we need to drop opaque types, too.
&elaborate_drops::ElaborateDrops,
// This will remove extraneous landing pads which are no longer
// necessary as well as well as forcing any call in a non-unwinding
@ -526,7 +527,6 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
body,
&[
&check_alignment::CheckAlignment,
&reveal_all::RevealAll, // has to be done before inlining, since inlined code is in RevealAll mode.
&lower_slice_len::LowerSliceLenCalls, // has to be done before inlining, otherwise actual call will be almost always inlined. Also simple, so can just do first
&unreachable_prop::UnreachablePropagation,
&uninhabited_enum_branching::UninhabitedEnumBranching,

View File

@ -8,10 +8,6 @@ use rustc_middle::ty::{self, Ty, TyCtxt};
pub struct RevealAll;
impl<'tcx> MirPass<'tcx> for RevealAll {
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
sess.mir_opt_level() >= 3 || super::inline::Inline.is_enabled(sess)
}
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
// Do not apply this transformation to generators.
if body.generator.is_some() {

View File

@ -302,7 +302,7 @@ pub fn return_impl_trait() -> i32 {
}
#[cfg(not(any(cfail1,cfail4)))]
#[rustc_clean(cfg = "cfail2", except = "hir_owner, hir_owner_nodes, typeck, fn_sig, optimized_mir")]
#[rustc_clean(cfg = "cfail2", except = "hir_owner, hir_owner_nodes, typeck, fn_sig")]
#[rustc_clean(cfg = "cfail3")]
#[rustc_clean(cfg = "cfail5", except = "hir_owner, hir_owner_nodes, typeck, fn_sig, optimized_mir")]
#[rustc_clean(cfg = "cfail6")]

View File

@ -15,28 +15,44 @@
StorageLive(_2);
StorageLive(_3);
StorageLive(_4);
_4 = hide_foo() -> [return: bb1, unwind unreachable];
_4 = hide_foo() -> [return: bb1, unwind: bb6];
}
bb1: {
_3 = &_4;
StorageLive(_5);
_5 = ();
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind unreachable];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind unreachable];
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
}
bb2: {
StorageDead(_5);
StorageDead(_3);
StorageDead(_4);
StorageDead(_2);
_0 = const ();
drop(_1) -> [return: bb3, unwind unreachable];
drop(_4) -> [return: bb3, unwind: bb6];
}
bb3: {
StorageDead(_4);
StorageDead(_2);
_0 = const ();
drop(_1) -> [return: bb4, unwind: bb7];
}
bb4: {
return;
}
bb5 (cleanup): {
drop(_4) -> [return: bb6, unwind terminate(cleanup)];
}
bb6 (cleanup): {
drop(_1) -> [return: bb7, unwind terminate(cleanup)];
}
bb7 (cleanup): {
resume;
}
}

View File

@ -15,35 +15,43 @@
StorageLive(_2);
StorageLive(_3);
StorageLive(_4);
_4 = hide_foo() -> [return: bb1, unwind: bb4];
_4 = hide_foo() -> [return: bb1, unwind: bb6];
}
bb1: {
_3 = &_4;
StorageLive(_5);
_5 = ();
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb4];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb4];
- _2 = <impl Fn() as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
+ _2 = <fn() {foo} as Fn<()>>::call(move _3, move _5) -> [return: bb2, unwind: bb5];
}
bb2: {
StorageDead(_5);
StorageDead(_3);
StorageDead(_4);
StorageDead(_2);
_0 = const ();
drop(_1) -> [return: bb3, unwind: bb5];
drop(_4) -> [return: bb3, unwind: bb6];
}
bb3: {
StorageDead(_4);
StorageDead(_2);
_0 = const ();
drop(_1) -> [return: bb4, unwind continue];
}
bb4: {
return;
}
bb4 (cleanup): {
drop(_1) -> [return: bb5, unwind terminate(cleanup)];
bb5 (cleanup): {
drop(_4) -> [return: bb6, unwind terminate(cleanup)];
}
bb5 (cleanup): {
bb6 (cleanup): {
drop(_1) -> [return: bb7, unwind terminate(cleanup)];
}
bb7 (cleanup): {
resume;
}
}

View File

@ -32,6 +32,7 @@ where
#[rustc_polymorphize_error]
pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
//~^ ERROR item has unused generic parameters
|| {
//~^ ERROR item has unused generic parameters
yield 1;
@ -57,6 +58,7 @@ pub fn used_type_in_return<R: Default>() -> impl Generator<(), Yield = u32, Retu
#[rustc_polymorphize_error]
pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
//~^ ERROR item has unused generic parameters
|| {
//~^ ERROR item has unused generic parameters
yield 1;

View File

@ -8,20 +8,34 @@ LL | #![feature(generic_const_exprs, generators, generator_trait, rustc_attrs)]
= note: `#[warn(incomplete_features)]` on by default
error: item has unused generic parameters
--> $DIR/generators.rs:35:5
--> $DIR/generators.rs:36:5
|
LL | pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| - generic parameter `T` is unused
LL |
LL | || {
| ^^
error: item has unused generic parameters
--> $DIR/generators.rs:60:5
--> $DIR/generators.rs:34:8
|
LL | pub fn unused_type<T>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| ^^^^^^^^^^^ - generic parameter `T` is unused
error: item has unused generic parameters
--> $DIR/generators.rs:62:5
|
LL | pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| ------------ generic parameter `T` is unused
LL |
LL | || {
| ^^
error: aborting due to 2 previous errors; 1 warning emitted
error: item has unused generic parameters
--> $DIR/generators.rs:60:8
|
LL | pub fn unused_const<const T: u32>() -> impl Generator<(), Yield = u32, Return = u32> + Unpin {
| ^^^^^^^^^^^^ ------------ generic parameter `T` is unused
error: aborting due to 4 previous errors; 1 warning emitted

View File

@ -0,0 +1,18 @@
// build-pass
#![feature(type_alias_impl_trait)]
pub struct Foo {
/// This type must have nontrivial drop glue
field: String,
}
pub type Tait = impl Sized;
pub fn ice_cold(beverage: Tait) {
// Must destructure at least one field of `Foo`
let Foo { field } = beverage;
_ = field;
}
fn main() {}