-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #110833 - compiler-errors:rustc-call-inliner-ice, r=cjg…
…illot Only unpack tupled args in inliner if we expect args to be unpacked `"rust-call"` is a strange function abi. sometimes, it expects the arguments to be unpacked by the caller and passed as individual args (closure bodies), and sometimes it does not (user functions annotated with the `"rust-call"` abi). make sure the mir inliner respects this difference when checking that arguments are compatible, and doesn't try to ICE when we call a `extern "rust-call"` function in a generic context. fixes #110829
- Loading branch information
Showing
17 changed files
with
255 additions
and
159 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
tests/mir-opt/inline/dont_ice_on_generic_rust_call.call.Inline.panic-abort.diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
- // MIR for `call` before Inline | ||
+ // MIR for `call` after Inline | ||
|
||
fn call(_1: Box<dyn FnMut<I, Output = ()>>, _2: I) -> () { | ||
debug mock => _1; | ||
debug input => _2; | ||
let mut _0: (); | ||
let mut _3: &mut std::boxed::Box<dyn std::ops::FnMut<I, Output = ()>>; | ||
let mut _4: I; | ||
|
||
bb0: { | ||
StorageLive(_3); | ||
_3 = &mut _1; | ||
StorageLive(_4); | ||
_4 = move _2; | ||
_0 = <Box<dyn FnMut<I, Output = ()>> as FnMut<I>>::call_mut(move _3, move _4) -> [return: bb1, unwind unreachable]; | ||
} | ||
|
||
bb1: { | ||
StorageDead(_4); | ||
StorageDead(_3); | ||
drop(_1) -> [return: bb2, unwind unreachable]; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
} | ||
|
37 changes: 37 additions & 0 deletions
37
tests/mir-opt/inline/dont_ice_on_generic_rust_call.call.Inline.panic-unwind.diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
- // MIR for `call` before Inline | ||
+ // MIR for `call` after Inline | ||
|
||
fn call(_1: Box<dyn FnMut<I, Output = ()>>, _2: I) -> () { | ||
debug mock => _1; | ||
debug input => _2; | ||
let mut _0: (); | ||
let mut _3: &mut std::boxed::Box<dyn std::ops::FnMut<I, Output = ()>>; | ||
let mut _4: I; | ||
|
||
bb0: { | ||
StorageLive(_3); | ||
_3 = &mut _1; | ||
StorageLive(_4); | ||
_4 = move _2; | ||
_0 = <Box<dyn FnMut<I, Output = ()>> as FnMut<I>>::call_mut(move _3, move _4) -> [return: bb1, unwind: bb3]; | ||
} | ||
|
||
bb1: { | ||
StorageDead(_4); | ||
StorageDead(_3); | ||
drop(_1) -> [return: bb2, unwind: bb4]; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
|
||
bb3 (cleanup): { | ||
drop(_1) -> [return: bb4, unwind terminate]; | ||
} | ||
|
||
bb4 (cleanup): { | ||
resume; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY | ||
// compile-flags: -Zmir-enable-passes=+Inline --crate-type=lib | ||
|
||
#![feature(fn_traits, tuple_trait, unboxed_closures)] | ||
|
||
use std::marker::Tuple; | ||
|
||
// EMIT_MIR dont_ice_on_generic_rust_call.call.Inline.diff | ||
pub fn call<I: Tuple>(mut mock: Box<dyn FnMut<I, Output = ()>>, input: I) { | ||
mock.call_mut(input) | ||
} |
32 changes: 32 additions & 0 deletions
32
tests/mir-opt/inline/inline_box_fn.call.Inline.panic-abort.diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
- // MIR for `call` before Inline | ||
+ // MIR for `call` after Inline | ||
|
||
fn call(_1: Box<dyn Fn(i32)>) -> () { | ||
debug x => _1; | ||
let mut _0: (); | ||
let _2: (); | ||
let mut _3: &std::boxed::Box<dyn std::ops::Fn(i32)>; | ||
let mut _4: (i32,); | ||
|
||
bb0: { | ||
StorageLive(_2); | ||
StorageLive(_3); | ||
_3 = &_1; | ||
StorageLive(_4); | ||
_4 = (const 1_i32,); | ||
_2 = <Box<dyn Fn(i32)> as Fn<(i32,)>>::call(move _3, move _4) -> [return: bb1, unwind unreachable]; | ||
} | ||
|
||
bb1: { | ||
StorageDead(_4); | ||
StorageDead(_3); | ||
StorageDead(_2); | ||
_0 = const (); | ||
drop(_1) -> [return: bb2, unwind unreachable]; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
} | ||
|
40 changes: 40 additions & 0 deletions
40
tests/mir-opt/inline/inline_box_fn.call.Inline.panic-unwind.diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
- // MIR for `call` before Inline | ||
+ // MIR for `call` after Inline | ||
|
||
fn call(_1: Box<dyn Fn(i32)>) -> () { | ||
debug x => _1; | ||
let mut _0: (); | ||
let _2: (); | ||
let mut _3: &std::boxed::Box<dyn std::ops::Fn(i32)>; | ||
let mut _4: (i32,); | ||
|
||
bb0: { | ||
StorageLive(_2); | ||
StorageLive(_3); | ||
_3 = &_1; | ||
StorageLive(_4); | ||
_4 = (const 1_i32,); | ||
_2 = <Box<dyn Fn(i32)> as Fn<(i32,)>>::call(move _3, move _4) -> [return: bb1, unwind: bb3]; | ||
} | ||
|
||
bb1: { | ||
StorageDead(_4); | ||
StorageDead(_3); | ||
StorageDead(_2); | ||
_0 = const (); | ||
drop(_1) -> [return: bb2, unwind: bb4]; | ||
} | ||
|
||
bb2: { | ||
return; | ||
} | ||
|
||
bb3 (cleanup): { | ||
drop(_1) -> [return: bb4, unwind terminate]; | ||
} | ||
|
||
bb4 (cleanup): { | ||
resume; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY | ||
// unit-test: Inline | ||
// compile-flags: --crate-type=lib | ||
|
||
// EMIT_MIR inline_box_fn.call.Inline.diff | ||
fn call(x: Box<dyn Fn(i32)>) { | ||
x(1); | ||
} |
Oops, something went wrong.