diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index f30732e6aaf3b..254bbb8678f78 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -209,6 +209,9 @@ impl<'tcx> Inliner<'tcx> { let callee_body = try_instance_mir(self.tcx, callsite.callee.def)?; self.check_mir_body(callsite, callee_body, callee_attrs, cross_crate_inlinable)?; + if let Some(_) = callee_body.tainted_by_errors { + return Err("Body is tainted"); + } if !self.tcx.consider_optimizing(|| { format!("Inline {:?} into {:?}", callsite.callee, caller_body.source) diff --git a/tests/crashes/122909.rs b/tests/ui/polymorphization/inline-tainted-body.rs similarity index 58% rename from tests/crashes/122909.rs rename to tests/ui/polymorphization/inline-tainted-body.rs index 90bba772b915e..b8d57a3121291 100644 --- a/tests/crashes/122909.rs +++ b/tests/ui/polymorphization/inline-tainted-body.rs @@ -1,15 +1,21 @@ //@ compile-flags: -Zpolymorphize=on -Zinline-mir=yes -//@ known-bug: #122909 +#![feature(unboxed_closures)] -use std::sync::{Arc, Context, Weak}; +use std::sync::Arc; pub struct WeakOnce(); +//~^ ERROR type parameter `T` is never used + impl WeakOnce { extern "rust-call" fn try_get(&self) -> Option> {} + //~^ ERROR functions with the "rust-call" ABI must take a single non-self tuple argument + //~| ERROR mismatched types pub fn get(&self) -> Arc { self.try_get() .unwrap_or_else(|| panic!("Singleton {} not available", std::any::type_name::())) } } + +fn main() {} diff --git a/tests/ui/polymorphization/inline-tainted-body.stderr b/tests/ui/polymorphization/inline-tainted-body.stderr new file mode 100644 index 0000000000000..5c3bd70adae00 --- /dev/null +++ b/tests/ui/polymorphization/inline-tainted-body.stderr @@ -0,0 +1,30 @@ +error[E0392]: type parameter `T` is never used + --> $DIR/inline-tainted-body.rs:7:21 + | +LL | pub struct WeakOnce(); + | ^ unused type parameter + | + = help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData` + = help: if you intended `T` to be a const parameter, use `const T: /* Type */` instead + +error: functions with the "rust-call" ABI must take a single non-self tuple argument + --> $DIR/inline-tainted-body.rs:11:35 + | +LL | extern "rust-call" fn try_get(&self) -> Option> {} + | ^^^^^ + +error[E0308]: mismatched types + --> $DIR/inline-tainted-body.rs:11:45 + | +LL | extern "rust-call" fn try_get(&self) -> Option> {} + | ------- ^^^^^^^^^^^^^^ expected `Option>`, found `()` + | | + | implicitly returns `()` as its body has no tail or `return` expression + | + = note: expected enum `Option>` + found unit type `()` + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0308, E0392. +For more information about an error, try `rustc --explain E0308`.