From 1d8b9505159a2ffa090b66211c679e7df5f97767 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sat, 23 Nov 2024 01:24:19 +0000 Subject: [PATCH] Check args arity in mir inliner --- compiler/rustc_mir_transform/src/inline.rs | 8 +++++++ tests/crashes/121127.rs | 23 -------------------- tests/crashes/129075.rs | 16 -------------- tests/crashes/129127.rs | 21 ------------------ tests/crashes/131294-2.rs | 25 ---------------------- tests/crashes/131294.rs | 16 -------------- tests/ui/mir/inline-wrong-args.rs | 16 ++++++++++++++ tests/ui/mir/inline-wrong-args.stderr | 11 ++++++++++ 8 files changed, 35 insertions(+), 101 deletions(-) delete mode 100644 tests/crashes/121127.rs delete mode 100644 tests/crashes/129075.rs delete mode 100644 tests/crashes/129127.rs delete mode 100644 tests/crashes/131294-2.rs delete mode 100644 tests/crashes/131294.rs create mode 100644 tests/ui/mir/inline-wrong-args.rs create mode 100644 tests/ui/mir/inline-wrong-args.stderr diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index 00f6c3845d41e..e5fc57b4e6f7c 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -268,6 +268,10 @@ impl<'tcx> Inliner<'tcx> { bug!("Closure arguments are not passed as a tuple"); }; + if arg_tuple_tys.len() + self_arg_ty.map_or(0, |_| 1) != callee_body.args_iter().len() { + return Err("arg arity mismatch"); + } + for (arg_ty, input) in self_arg_ty.into_iter().chain(arg_tuple_tys).zip(callee_body.args_iter()) { @@ -278,6 +282,10 @@ impl<'tcx> Inliner<'tcx> { } } } else { + if args.len() != callee_body.args_iter().len() { + return Err("arg arity mismatch"); + } + for (arg, input) in args.iter().zip(callee_body.args_iter()) { let input_type = callee_body.local_decls[input].ty; let arg_ty = arg.node.ty(&caller_body.local_decls, self.tcx); diff --git a/tests/crashes/121127.rs b/tests/crashes/121127.rs deleted file mode 100644 index e50dc7763fc65..0000000000000 --- a/tests/crashes/121127.rs +++ /dev/null @@ -1,23 +0,0 @@ -//@ known-bug: #121127 -//@ compile-flags: -Zvalidate-mir -Zinline-mir=yes -C debuginfo=2 -// Note that as of PR#123949 this only crashes with debuginfo enabled - -#![feature(specialization)] - -pub trait Foo { - fn abc() -> u32; -} - -pub trait Marker {} - -impl Foo for T { - default fn abc(f: fn(&T), t: &T) -> u32 { - 16 - } -} - -impl Foo for T { - fn def() -> u32 { - Self::abc() - } -} diff --git a/tests/crashes/129075.rs b/tests/crashes/129075.rs deleted file mode 100644 index 4a0e920914cc5..0000000000000 --- a/tests/crashes/129075.rs +++ /dev/null @@ -1,16 +0,0 @@ -//@ known-bug: rust-lang/rust#129075 -//@ compile-flags: -Zvalidate-mir -Zinline-mir=yes - -struct Foo([T; 2]); - -impl Default for Foo { - fn default(&mut self) -> Self { - Foo([Default::default(); 2]) - } -} - -fn field_array() { - let a: i32; - let b; - Foo([a, b]) = Default::default(); -} diff --git a/tests/crashes/129127.rs b/tests/crashes/129127.rs deleted file mode 100644 index 8ec848dbd0578..0000000000000 --- a/tests/crashes/129127.rs +++ /dev/null @@ -1,21 +0,0 @@ -//@ known-bug: rust-lang/rust#129127 -//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir -Zcross-crate-inline-threshold=always - - - - -pub struct Rows<'a>(); - -impl<'a> Iterator for Rows<'a> { - type Item = (); - - fn next() -> Option { - let mut rows = Rows(); - rows.map(|row| row).next() - } -} - -fn main() { - let mut rows = Rows(); - rows.next(); -} diff --git a/tests/crashes/131294-2.rs b/tests/crashes/131294-2.rs deleted file mode 100644 index 130a8b10fb78e..0000000000000 --- a/tests/crashes/131294-2.rs +++ /dev/null @@ -1,25 +0,0 @@ -//@ known-bug: #131294 -//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir -Zcross-crate-inline-threshold=always - -// https://github.com/rust-lang/rust/issues/131294#issuecomment-2395088049 second comment -struct Rows; - -impl Iterator for Rows { - type Item = String; - - fn next() -> Option { - let args = format_args!("Hello world"); - - { - match args.as_str() { - Some(t) => t.to_owned(), - None => String::new(), - } - } - .into() - } -} - -fn main() { - Rows.next(); -} diff --git a/tests/crashes/131294.rs b/tests/crashes/131294.rs deleted file mode 100644 index ec6c95674677e..0000000000000 --- a/tests/crashes/131294.rs +++ /dev/null @@ -1,16 +0,0 @@ -//@ known-bug: #131294 -//@ compile-flags: -Zmir-opt-level=5 -Zvalidate-mir -Zcross-crate-inline-threshold=always - -struct Rows; - -impl Iterator for Rows { - type Item = String; - - fn next() -> Option { - std::fmt::format(format_args!("Hello world")).into() - } -} - -fn main() { - Rows.next(); -} diff --git a/tests/ui/mir/inline-wrong-args.rs b/tests/ui/mir/inline-wrong-args.rs new file mode 100644 index 0000000000000..2009f157b0dc6 --- /dev/null +++ b/tests/ui/mir/inline-wrong-args.rs @@ -0,0 +1,16 @@ +//@ compile-flags: -Zvalidate-mir -Zinline-mir -Zinline-mir-threshold=500 + +struct Foo([T; 2]); + +impl Default for Foo { + fn default(&self) -> Self { + //~^ ERROR method `default` has a `&self` declaration in the impl, but not in the trait + Foo([Default::default(); 2]) + } +} + +fn field_array() { + let Foo([a, b]): Foo = Default::default(); +} + +fn main() {} diff --git a/tests/ui/mir/inline-wrong-args.stderr b/tests/ui/mir/inline-wrong-args.stderr new file mode 100644 index 0000000000000..5cfe3c641492e --- /dev/null +++ b/tests/ui/mir/inline-wrong-args.stderr @@ -0,0 +1,11 @@ +error[E0185]: method `default` has a `&self` declaration in the impl, but not in the trait + --> $DIR/inline-wrong-args.rs:6:5 + | +LL | fn default(&self) -> Self { + | ^^^^^^^^^^^^^^^^^^^^^^^^^ `&self` used in impl + | + = note: `default` from trait: `fn() -> Self` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0185`.