Skip to content

Commit

Permalink
Rollup merge of #103276 - compiler-errors:default-on-uninit-ice, r=Ta…
Browse files Browse the repository at this point in the history
…KO8Ki

Erase regions before checking for `Default` in uninitialized binding error

Fixes #103250
  • Loading branch information
matthiaskrgr committed Oct 20, 2022
2 parents 1f21023 + c5c9f74 commit e29ecb7
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 2 deletions.
11 changes: 9 additions & 2 deletions compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,10 +492,17 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
let Some(default_trait) = tcx.get_diagnostic_item(sym::Default) else {
return false;
};
// Regions are already solved, so we must use a fresh InferCtxt,
// but the type has region variables, so erase those.
tcx.infer_ctxt()
.build()
.type_implements_trait(default_trait, ty, ty::List::empty(), param_env)
.may_apply()
.type_implements_trait(
default_trait,
tcx.erase_regions(ty),
ty::List::empty(),
param_env,
)
.must_apply_modulo_regions()
};

let assign_value = match ty.kind() {
Expand Down
37 changes: 37 additions & 0 deletions src/test/ui/borrowck/issue-103250.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// edition:2021

type TranslateFn = Box<dyn Fn(String, String) -> String>;

pub struct DeviceCluster {
devices: Vec<Device>,
}

impl DeviceCluster {
pub async fn do_something(&mut self) -> Result<String, Box<dyn std::error::Error>> {
let mut last_error: Box<dyn std::error::Error>;

for device in &mut self.devices {
match device.do_something().await {
Ok(info) => {
return Ok(info);
}
Err(e) => {}
}
}

Err(last_error)
//~^ ERROR used binding `last_error` isn't initialized
}
}

pub struct Device {
translate_fn: Option<TranslateFn>,
}

impl Device {
pub async fn do_something(&mut self) -> Result<String, Box<dyn std::error::Error>> {
Ok(String::from(""))
}
}

fn main() {}
17 changes: 17 additions & 0 deletions src/test/ui/borrowck/issue-103250.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0381]: used binding `last_error` isn't initialized
--> $DIR/issue-103250.rs:22:13
|
LL | let mut last_error: Box<dyn std::error::Error>;
| -------------- binding declared here but left uninitialized
...
LL | Err(last_error)
| ^^^^^^^^^^ `last_error` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let mut last_error: Box<dyn std::error::Error> = todo!();
| +++++++++

error: aborting due to previous error

For more information about this error, try `rustc --explain E0381`.

0 comments on commit e29ecb7

Please sign in to comment.