Handle more cases of value suggestions
This commit is contained in:
@@ -652,6 +652,55 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||||||
err
|
err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ty_kind_suggestion(&self, ty: Ty<'tcx>) -> Option<String> {
|
||||||
|
// Keep in sync with `rustc_hir_analysis/src/check/mod.rs:ty_kind_suggestion`.
|
||||||
|
// FIXME: deduplicate the above.
|
||||||
|
let implements_default = |ty| {
|
||||||
|
let Some(default_trait) = self.infcx.tcx.get_diagnostic_item(sym::Default) else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
self.infcx
|
||||||
|
.type_implements_trait(default_trait, [ty], self.param_env)
|
||||||
|
.must_apply_modulo_regions()
|
||||||
|
};
|
||||||
|
|
||||||
|
Some(match ty.kind() {
|
||||||
|
ty::Never | ty::Error(_) => return None,
|
||||||
|
ty::Bool => "false".to_string(),
|
||||||
|
ty::Char => "\'x\'".to_string(),
|
||||||
|
ty::Int(_) | ty::Uint(_) => "42".into(),
|
||||||
|
ty::Float(_) => "3.14159".into(),
|
||||||
|
ty::Slice(_) => "[]".to_string(),
|
||||||
|
ty::Adt(def, _) if Some(def.did()) == self.infcx.tcx.get_diagnostic_item(sym::Vec) => {
|
||||||
|
"vec![]".to_string()
|
||||||
|
}
|
||||||
|
ty::Adt(_, _) if implements_default(ty) => "Default::default()".to_string(),
|
||||||
|
ty::Ref(_, ty, mutability) => {
|
||||||
|
if let (ty::Str, hir::Mutability::Not) = (ty.kind(), mutability) {
|
||||||
|
"\"\"".to_string()
|
||||||
|
} else {
|
||||||
|
let Some(ty) = self.ty_kind_suggestion(*ty) else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
format!("&{}{ty}", mutability.prefix_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ty::Array(ty, len) => format!(
|
||||||
|
"[{}; {}]",
|
||||||
|
self.ty_kind_suggestion(*ty)?,
|
||||||
|
len.eval_target_usize(self.infcx.tcx, ty::ParamEnv::reveal_all()),
|
||||||
|
),
|
||||||
|
ty::Tuple(tys) => format!(
|
||||||
|
"({})",
|
||||||
|
tys.iter()
|
||||||
|
.map(|ty| self.ty_kind_suggestion(ty))
|
||||||
|
.collect::<Option<Vec<String>>>()?
|
||||||
|
.join(", ")
|
||||||
|
),
|
||||||
|
_ => "value".to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn suggest_assign_value(
|
fn suggest_assign_value(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diag<'_>,
|
err: &mut Diag<'_>,
|
||||||
@@ -661,24 +710,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||||||
let ty = moved_place.ty(self.body, self.infcx.tcx).ty;
|
let ty = moved_place.ty(self.body, self.infcx.tcx).ty;
|
||||||
debug!("ty: {:?}, kind: {:?}", ty, ty.kind());
|
debug!("ty: {:?}, kind: {:?}", ty, ty.kind());
|
||||||
|
|
||||||
let tcx = self.infcx.tcx;
|
let Some(assign_value) = self.ty_kind_suggestion(ty) else {
|
||||||
let implements_default = |ty, param_env| {
|
return;
|
||||||
let Some(default_trait) = tcx.get_diagnostic_item(sym::Default) else {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
self.infcx
|
|
||||||
.type_implements_trait(default_trait, [ty], param_env)
|
|
||||||
.must_apply_modulo_regions()
|
|
||||||
};
|
|
||||||
|
|
||||||
let assign_value = match ty.kind() {
|
|
||||||
ty::Never | ty::Error(_) => return,
|
|
||||||
ty::Bool => "false",
|
|
||||||
ty::Float(_) => "0.0",
|
|
||||||
ty::Int(_) | ty::Uint(_) => "0",
|
|
||||||
ty::Adt(def, _) if Some(def.did()) == tcx.get_diagnostic_item(sym::Vec) => "vec![]",
|
|
||||||
ty::Adt(_, _) if implements_default(ty, self.param_env) => "Default::default()",
|
|
||||||
_ => "value",
|
|
||||||
};
|
};
|
||||||
|
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ use rustc_errors::ErrorGuaranteed;
|
|||||||
use rustc_errors::{pluralize, struct_span_code_err, Diag};
|
use rustc_errors::{pluralize, struct_span_code_err, Diag};
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
|
use rustc_hir::Mutability;
|
||||||
use rustc_index::bit_set::BitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
use rustc_infer::infer::error_reporting::ObligationCauseExt as _;
|
use rustc_infer::infer::error_reporting::ObligationCauseExt as _;
|
||||||
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
|
||||||
@@ -467,7 +468,9 @@ fn fn_sig_suggestion<'tcx>(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ty_kind_suggestion<'tcx>(ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> Option<&'static str> {
|
pub fn ty_kind_suggestion<'tcx>(ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> Option<String> {
|
||||||
|
// Keep in sync with `rustc_borrowck/src/diagnostics/conflict_errors.rs:ty_kind_suggestion`.
|
||||||
|
// FIXME: deduplicate the above.
|
||||||
let implements_default = |ty| {
|
let implements_default = |ty| {
|
||||||
let Some(default_trait) = tcx.get_diagnostic_item(sym::Default) else {
|
let Some(default_trait) = tcx.get_diagnostic_item(sym::Default) else {
|
||||||
return false;
|
return false;
|
||||||
@@ -478,14 +481,39 @@ pub fn ty_kind_suggestion<'tcx>(ty: Ty<'tcx>, tcx: TyCtxt<'tcx>) -> Option<&'sta
|
|||||||
.must_apply_modulo_regions()
|
.must_apply_modulo_regions()
|
||||||
};
|
};
|
||||||
Some(match ty.kind() {
|
Some(match ty.kind() {
|
||||||
ty::Bool => "true",
|
ty::Never | ty::Error(_) => return None,
|
||||||
ty::Char => "'a'",
|
ty::Bool => "false".to_string(),
|
||||||
ty::Int(_) | ty::Uint(_) => "42",
|
ty::Char => "\'x\'".to_string(),
|
||||||
ty::Float(_) => "3.14159",
|
ty::Int(_) | ty::Uint(_) => "42".into(),
|
||||||
ty::Error(_) | ty::Never => return None,
|
ty::Float(_) => "3.14159".into(),
|
||||||
ty::Adt(def, _) if Some(def.did()) == tcx.get_diagnostic_item(sym::Vec) => "vec![]",
|
ty::Slice(_) => "[]".to_string(),
|
||||||
ty::Adt(_, _) if implements_default(ty) => "Default::default()",
|
ty::Adt(def, _) if Some(def.did()) == tcx.get_diagnostic_item(sym::Vec) => {
|
||||||
_ => "value",
|
"vec![]".to_string()
|
||||||
|
}
|
||||||
|
ty::Adt(_, _) if implements_default(ty) => "Default::default()".to_string(),
|
||||||
|
ty::Ref(_, ty, mutability) => {
|
||||||
|
if let (ty::Str, Mutability::Not) = (ty.kind(), mutability) {
|
||||||
|
"\"\"".to_string()
|
||||||
|
} else {
|
||||||
|
let Some(ty) = ty_kind_suggestion(*ty, tcx) else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
format!("&{}{ty}", mutability.prefix_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ty::Array(ty, len) => format!(
|
||||||
|
"[{}; {}]",
|
||||||
|
ty_kind_suggestion(*ty, tcx)?,
|
||||||
|
len.eval_target_usize(tcx, ty::ParamEnv::reveal_all()),
|
||||||
|
),
|
||||||
|
ty::Tuple(tys) => format!(
|
||||||
|
"({})",
|
||||||
|
tys.iter()
|
||||||
|
.map(|ty| ty_kind_suggestion(ty, tcx))
|
||||||
|
.collect::<Option<Vec<String>>>()?
|
||||||
|
.join(", ")
|
||||||
|
),
|
||||||
|
_ => "value".to_string(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,7 +551,7 @@ fn suggestion_signature<'tcx>(
|
|||||||
}
|
}
|
||||||
ty::AssocKind::Const => {
|
ty::AssocKind::Const => {
|
||||||
let ty = tcx.type_of(assoc.def_id).instantiate_identity();
|
let ty = tcx.type_of(assoc.def_id).instantiate_identity();
|
||||||
let val = ty_kind_suggestion(ty, tcx).unwrap_or("todo!()");
|
let val = ty_kind_suggestion(ty, tcx).unwrap_or_else(|| "value".to_string());
|
||||||
format!("const {}: {} = {};", assoc.name, ty, val)
|
format!("const {}: {} = {};", assoc.name, ty, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | asm!("{}", in(reg) x);
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: u64 = 0;
|
LL | let x: u64 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `y` isn't initialized
|
error[E0381]: used binding `y` isn't initialized
|
||||||
--> $DIR/type-check-5.rs:18:9
|
--> $DIR/type-check-5.rs:18:9
|
||||||
@@ -21,8 +21,8 @@ LL | asm!("{}", inout(reg) y);
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let mut y: u64 = 0;
|
LL | let mut y: u64 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0596]: cannot borrow `v` as mutable, as it is not declared as mutable
|
error[E0596]: cannot borrow `v` as mutable, as it is not declared as mutable
|
||||||
--> $DIR/type-check-5.rs:24:13
|
--> $DIR/type-check-5.rs:24:13
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ LL | xs
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let xs = value;
|
LL | let xs = &42;
|
||||||
| +++++++
|
| +++++
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ LL | xs
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let xs = value;
|
LL | let xs = &42;
|
||||||
| +++++++
|
| +++++
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ LL | println!("{}", x);
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ LL | println!("{}", x);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ LL | println!("{}", x);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | i
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let i: isize = 0;
|
LL | let i: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | i
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let i: isize = 0;
|
LL | let i: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | v += 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let v: isize = 0;
|
LL | let v: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | v = v + 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let mut v: isize = 0;
|
LL | let mut v: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | return x;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | let _ = x + 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: i32 = 0;
|
LL | let x: i32 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ LL | baz(bar);
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let bar = 0;
|
LL | let bar = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | x += 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:9:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:9:5
|
||||||
@@ -21,8 +21,8 @@ LL | x -= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:12:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:12:5
|
||||||
@@ -34,8 +34,8 @@ LL | x *= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:15:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:15:5
|
||||||
@@ -47,8 +47,8 @@ LL | x /= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:18:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:18:5
|
||||||
@@ -60,8 +60,8 @@ LL | x %= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:21:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:21:5
|
||||||
@@ -73,8 +73,8 @@ LL | x ^= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:24:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:24:5
|
||||||
@@ -86,8 +86,8 @@ LL | x &= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:27:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:27:5
|
||||||
@@ -99,8 +99,8 @@ LL | x |= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:30:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:30:5
|
||||||
@@ -112,8 +112,8 @@ LL | x <<= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-in-assignop.rs:33:5
|
--> $DIR/borrowck-uninit-in-assignop.rs:33:5
|
||||||
@@ -125,8 +125,8 @@ LL | x >>= 1;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 10 previous errors
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | let _y = &**x;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: &&Box<i32> = value;
|
LL | let x: &&Box<i32> = &&Default::default();
|
||||||
| +++++++
|
| ++++++++++++++++++++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-ref-chain.rs:11:14
|
--> $DIR/borrowck-uninit-ref-chain.rs:11:14
|
||||||
@@ -21,8 +21,8 @@ LL | let _y = &**x;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: &&S<i32, i32> = value;
|
LL | let x: &&S<i32, i32> = &&value;
|
||||||
| +++++++
|
| +++++++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-uninit-ref-chain.rs:14:14
|
--> $DIR/borrowck-uninit-ref-chain.rs:14:14
|
||||||
@@ -34,8 +34,8 @@ LL | let _y = &**x;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: &&i32 = value;
|
LL | let x: &&i32 = &&42;
|
||||||
| +++++++
|
| ++++++
|
||||||
|
|
||||||
error[E0381]: partially assigned binding `a` isn't fully initialized
|
error[E0381]: partially assigned binding `a` isn't fully initialized
|
||||||
--> $DIR/borrowck-uninit-ref-chain.rs:18:5
|
--> $DIR/borrowck-uninit-ref-chain.rs:18:5
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | foo(x);
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: isize = 0;
|
LL | let x: isize = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `a` isn't initialized
|
error[E0381]: used binding `a` isn't initialized
|
||||||
--> $DIR/borrowck-uninit.rs:14:32
|
--> $DIR/borrowck-uninit.rs:14:32
|
||||||
|
|||||||
11
tests/ui/borrowck/borrowck-use-in-index-lvalue.fixed
Normal file
11
tests/ui/borrowck/borrowck-use-in-index-lvalue.fixed
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
#[allow(unused_mut)]
|
||||||
|
fn test() {
|
||||||
|
let w: &mut [isize] = &mut [];
|
||||||
|
w[5] = 0; //~ ERROR [E0381]
|
||||||
|
|
||||||
|
let mut w: &mut [isize] = &mut [];
|
||||||
|
w[5] = 0; //~ ERROR [E0381]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() { test(); }
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
#[allow(unused_mut)]
|
||||||
fn test() {
|
fn test() {
|
||||||
let w: &mut [isize];
|
let w: &mut [isize];
|
||||||
w[5] = 0; //~ ERROR [E0381]
|
w[5] = 0; //~ ERROR [E0381]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
error[E0381]: used binding `w` isn't initialized
|
error[E0381]: used binding `w` isn't initialized
|
||||||
--> $DIR/borrowck-use-in-index-lvalue.rs:3:5
|
--> $DIR/borrowck-use-in-index-lvalue.rs:5:5
|
||||||
|
|
|
|
||||||
LL | let w: &mut [isize];
|
LL | let w: &mut [isize];
|
||||||
| - binding declared here but left uninitialized
|
| - binding declared here but left uninitialized
|
||||||
@@ -8,11 +8,11 @@ LL | w[5] = 0;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let w: &mut [isize] = value;
|
LL | let w: &mut [isize] = &mut [];
|
||||||
| +++++++
|
| +++++++++
|
||||||
|
|
||||||
error[E0381]: used binding `w` isn't initialized
|
error[E0381]: used binding `w` isn't initialized
|
||||||
--> $DIR/borrowck-use-in-index-lvalue.rs:6:5
|
--> $DIR/borrowck-use-in-index-lvalue.rs:8:5
|
||||||
|
|
|
|
||||||
LL | let mut w: &mut [isize];
|
LL | let mut w: &mut [isize];
|
||||||
| ----- binding declared here but left uninitialized
|
| ----- binding declared here but left uninitialized
|
||||||
@@ -21,8 +21,8 @@ LL | w[5] = 0;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let mut w: &mut [isize] = value;
|
LL | let mut w: &mut [isize] = &mut [];
|
||||||
| +++++++
|
| +++++++++
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// Variation on `borrowck-use-uninitialized-in-cast` in which we do a
|
||||||
|
// trait cast from an uninitialized source. Issue #20791.
|
||||||
|
//@ run-rustfix
|
||||||
|
#![allow(unused_variables, dead_code)]
|
||||||
|
|
||||||
|
trait Foo { fn dummy(&self) { } }
|
||||||
|
impl Foo for i32 { }
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x: &i32 = &42;
|
||||||
|
let y = x as *const dyn Foo; //~ ERROR [E0381]
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
// Variation on `borrowck-use-uninitialized-in-cast` in which we do a
|
// Variation on `borrowck-use-uninitialized-in-cast` in which we do a
|
||||||
// trait cast from an uninitialized source. Issue #20791.
|
// trait cast from an uninitialized source. Issue #20791.
|
||||||
|
//@ run-rustfix
|
||||||
|
#![allow(unused_variables, dead_code)]
|
||||||
|
|
||||||
trait Foo { fn dummy(&self) { } }
|
trait Foo { fn dummy(&self) { } }
|
||||||
impl Foo for i32 { }
|
impl Foo for i32 { }
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-use-uninitialized-in-cast-trait.rs:9:13
|
--> $DIR/borrowck-use-uninitialized-in-cast-trait.rs:11:13
|
||||||
|
|
|
|
||||||
LL | let x: &i32;
|
LL | let x: &i32;
|
||||||
| - binding declared here but left uninitialized
|
| - binding declared here but left uninitialized
|
||||||
@@ -8,8 +8,8 @@ LL | let y = x as *const dyn Foo;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: &i32 = value;
|
LL | let x: &i32 = &42;
|
||||||
| +++++++
|
| +++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
10
tests/ui/borrowck/borrowck-use-uninitialized-in-cast.fixed
Normal file
10
tests/ui/borrowck/borrowck-use-uninitialized-in-cast.fixed
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// Check that we detect unused values that are cast to other things.
|
||||||
|
// The problem was specified to casting to `*`, as creating unsafe
|
||||||
|
// pointers was not being fully checked. Issue #20791.
|
||||||
|
//@ run-rustfix
|
||||||
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x: &i32 = &42;
|
||||||
|
let y = x as *const i32; //~ ERROR [E0381]
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
// Check that we detect unused values that are cast to other things.
|
// Check that we detect unused values that are cast to other things.
|
||||||
// The problem was specified to casting to `*`, as creating unsafe
|
// The problem was specified to casting to `*`, as creating unsafe
|
||||||
// pointers was not being fully checked. Issue #20791.
|
// pointers was not being fully checked. Issue #20791.
|
||||||
|
//@ run-rustfix
|
||||||
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x: &i32;
|
let x: &i32;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/borrowck-use-uninitialized-in-cast.rs:7:13
|
--> $DIR/borrowck-use-uninitialized-in-cast.rs:9:13
|
||||||
|
|
|
|
||||||
LL | let x: &i32;
|
LL | let x: &i32;
|
||||||
| - binding declared here but left uninitialized
|
| - binding declared here but left uninitialized
|
||||||
@@ -8,8 +8,8 @@ LL | let y = x as *const i32;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: &i32 = value;
|
LL | let x: &i32 = &42;
|
||||||
| +++++++
|
| +++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ LL | println!("{}", x);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: i32 = 0;
|
LL | let x: i32 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/issue-24267-flow-exit.rs:18:20
|
--> $DIR/issue-24267-flow-exit.rs:18:20
|
||||||
@@ -25,8 +25,8 @@ LL | println!("{}", x);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: i32 = 0;
|
LL | let x: i32 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ LL | ref u if true => {}
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let e: i32 = 0;
|
LL | let e: i32 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | apple(chaenomeles);
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let chaenomeles = 0;
|
LL | let chaenomeles = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `my_float` isn't initialized
|
error[E0381]: used binding `my_float` isn't initialized
|
||||||
--> $DIR/suggest-assign-rvalue.rs:23:30
|
--> $DIR/suggest-assign-rvalue.rs:23:30
|
||||||
@@ -22,8 +22,8 @@ LL | println!("my_float: {}", my_float);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let my_float: f32 = 0.0;
|
LL | let my_float: f32 = 3.14159;
|
||||||
| +++++
|
| +++++++++
|
||||||
|
|
||||||
error[E0381]: used binding `demo` isn't initialized
|
error[E0381]: used binding `demo` isn't initialized
|
||||||
--> $DIR/suggest-assign-rvalue.rs:26:28
|
--> $DIR/suggest-assign-rvalue.rs:26:28
|
||||||
@@ -64,8 +64,8 @@ LL | println!("arr: {:?}", arr);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let arr: [i32; 5] = value;
|
LL | let arr: [i32; 5] = [42; 5];
|
||||||
| +++++++
|
| +++++++++
|
||||||
|
|
||||||
error[E0381]: used binding `foo` isn't initialized
|
error[E0381]: used binding `foo` isn't initialized
|
||||||
--> $DIR/suggest-assign-rvalue.rs:37:27
|
--> $DIR/suggest-assign-rvalue.rs:37:27
|
||||||
@@ -106,8 +106,8 @@ LL | println!("my_int: {}", *my_int);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let my_int: &i32 = value;
|
LL | let my_int: &i32 = &42;
|
||||||
| +++++++
|
| +++++
|
||||||
|
|
||||||
error[E0381]: used binding `hello` isn't initialized
|
error[E0381]: used binding `hello` isn't initialized
|
||||||
--> $DIR/suggest-assign-rvalue.rs:49:27
|
--> $DIR/suggest-assign-rvalue.rs:49:27
|
||||||
@@ -120,8 +120,8 @@ LL | println!("hello: {}", hello);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let hello: &str = value;
|
LL | let hello: &str = "";
|
||||||
| +++++++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `never` isn't initialized
|
error[E0381]: used binding `never` isn't initialized
|
||||||
--> $DIR/suggest-assign-rvalue.rs:53:27
|
--> $DIR/suggest-assign-rvalue.rs:53:27
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ LL | let c1 = || match x { };
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: u8 = 0;
|
LL | let x: u8 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 8 previous errors
|
error: aborting due to 8 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
pub struct X<const N: usize = {
|
||||||
|
let s: &'static str = ""; s.len() //~ ERROR E0381
|
||||||
|
}>;
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
struct X<const N: usize = {
|
//@ run-rustfix
|
||||||
|
pub struct X<const N: usize = {
|
||||||
let s: &'static str; s.len() //~ ERROR E0381
|
let s: &'static str; s.len() //~ ERROR E0381
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
error[E0381]: used binding `s` isn't initialized
|
error[E0381]: used binding `s` isn't initialized
|
||||||
--> $DIR/const-generic-default-wont-borrowck.rs:2:26
|
--> $DIR/const-generic-default-wont-borrowck.rs:3:26
|
||||||
|
|
|
|
||||||
LL | let s: &'static str; s.len()
|
LL | let s: &'static str; s.len()
|
||||||
| - ^ `*s` used here but it isn't initialized
|
| - ^ `*s` used here but it isn't initialized
|
||||||
@@ -8,8 +8,8 @@ LL | let s: &'static str; s.len()
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let s: &'static str = value; s.len()
|
LL | let s: &'static str = ""; s.len()
|
||||||
| +++++++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | &x
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x = 0;
|
LL | let x = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: could not evaluate constant pattern
|
error: could not evaluate constant pattern
|
||||||
--> $DIR/issue-78655.rs:7:9
|
--> $DIR/issue-78655.rs:7:9
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ LL | let _ = [x; 0];
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: u8 = 0;
|
LL | let x: u8 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ LL | println!("{:?}", x);
|
|||||||
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x: i32 = 0;
|
LL | let x: i32 = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ LL | a[i] = d();
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let mut a: [D; 4] = value;
|
LL | let mut a: [D; 4] = [value; 4];
|
||||||
| +++++++
|
| ++++++++++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
@@ -126,8 +126,8 @@ LL | _ if { x; false } => 2,
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x = 0;
|
LL | let x = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0381]: used binding `x` isn't initialized
|
error[E0381]: used binding `x` isn't initialized
|
||||||
--> $DIR/match-cfg-fake-edges.rs:86:31
|
--> $DIR/match-cfg-fake-edges.rs:86:31
|
||||||
@@ -142,8 +142,8 @@ LL | _ if let Some(()) = { x; None } => 2,
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let x = 0;
|
LL | let x = 42;
|
||||||
| +++
|
| ++++
|
||||||
|
|
||||||
error[E0382]: use of moved value: `x`
|
error[E0382]: use of moved value: `x`
|
||||||
--> $DIR/match-cfg-fake-edges.rs:99:22
|
--> $DIR/match-cfg-fake-edges.rs:99:22
|
||||||
|
|||||||
31
tests/ui/uninhabited/privately-uninhabited-mir-call.fixed
Normal file
31
tests/ui/uninhabited/privately-uninhabited-mir-call.fixed
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
// Verifies that MIR building for a call expression respects
|
||||||
|
// privacy when checking if a call return type is uninhabited.
|
||||||
|
//@ run-rustfix
|
||||||
|
#![allow(unreachable_code, unused_variables)]
|
||||||
|
|
||||||
|
pub mod widget {
|
||||||
|
enum Unimplemented {}
|
||||||
|
pub struct Widget(Unimplemented);
|
||||||
|
|
||||||
|
impl Widget {
|
||||||
|
pub fn new() -> Widget {
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn f() {
|
||||||
|
let x: &mut u32;
|
||||||
|
Widget::new();
|
||||||
|
// Ok. Widget type returned from new is known to be uninhabited
|
||||||
|
// and the following code is considered unreachable.
|
||||||
|
*x = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let y: &mut u32 = &mut 42;
|
||||||
|
widget::Widget::new();
|
||||||
|
// Error. Widget type is not known to be uninhabited here,
|
||||||
|
// so the following code is considered reachable.
|
||||||
|
*y = 2; //~ ERROR E0381
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
// Verifies that MIR building for a call expression respects
|
// Verifies that MIR building for a call expression respects
|
||||||
// privacy when checking if a call return type is uninhabited.
|
// privacy when checking if a call return type is uninhabited.
|
||||||
|
//@ run-rustfix
|
||||||
|
#![allow(unreachable_code, unused_variables)]
|
||||||
|
|
||||||
pub mod widget {
|
pub mod widget {
|
||||||
enum Unimplemented {}
|
enum Unimplemented {}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
error[E0381]: used binding `y` isn't initialized
|
error[E0381]: used binding `y` isn't initialized
|
||||||
--> $DIR/privately-uninhabited-mir-call.rs:28:5
|
--> $DIR/privately-uninhabited-mir-call.rs:30:5
|
||||||
|
|
|
|
||||||
LL | let y: &mut u32;
|
LL | let y: &mut u32;
|
||||||
| - binding declared here but left uninitialized
|
| - binding declared here but left uninitialized
|
||||||
@@ -9,8 +9,8 @@ LL | *y = 2;
|
|||||||
|
|
|
|
||||||
help: consider assigning a value
|
help: consider assigning a value
|
||||||
|
|
|
|
||||||
LL | let y: &mut u32 = value;
|
LL | let y: &mut u32 = &mut 42;
|
||||||
| +++++++
|
| +++++++++
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user