Skip to content

Commit

Permalink
Don't inline tainted MIR bodies
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Aug 3, 2024
1 parent a604303 commit 309401e
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
3 changes: 3 additions & 0 deletions compiler/rustc_mir_transform/src/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<T>();
//~^ ERROR type parameter `T` is never used

impl<T> WeakOnce<T> {
extern "rust-call" fn try_get(&self) -> Option<Arc<T>> {}
//~^ ERROR functions with the "rust-call" ABI must take a single non-self tuple argument
//~| ERROR mismatched types

pub fn get(&self) -> Arc<T> {
self.try_get()
.unwrap_or_else(|| panic!("Singleton {} not available", std::any::type_name::<T>()))
}
}

fn main() {}
30 changes: 30 additions & 0 deletions tests/ui/polymorphization/inline-tainted-body.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
error[E0392]: type parameter `T` is never used
--> $DIR/inline-tainted-body.rs:7:21
|
LL | pub struct WeakOnce<T>();
| ^ 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<Arc<T>> {}
| ^^^^^

error[E0308]: mismatched types
--> $DIR/inline-tainted-body.rs:11:45
|
LL | extern "rust-call" fn try_get(&self) -> Option<Arc<T>> {}
| ------- ^^^^^^^^^^^^^^ expected `Option<Arc<T>>`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
|
= note: expected enum `Option<Arc<T>>`
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`.

0 comments on commit 309401e

Please sign in to comment.