Rollup merge of #127948 - surechen:fix_127915, r=compiler-errors

fixes panic error `index out of bounds` in conflicting error

fixes #127915
This commit is contained in:
Matthias Krüger 2024-07-20 07:13:44 +02:00 committed by GitHub
commit 767b3cb54b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 4 deletions

View File

@ -456,10 +456,15 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, '_, 'infcx, 'tcx> {
if let Some(def_id) = def_id
&& self.infcx.tcx.def_kind(def_id).is_fn_like()
&& let Some(pos) = args.iter().position(|arg| arg.hir_id == expr.hir_id)
&& let ty::Param(_) =
self.infcx.tcx.fn_sig(def_id).skip_binder().skip_binder().inputs()
[pos + offset]
.kind()
&& let Some(arg) = self
.infcx
.tcx
.fn_sig(def_id)
.skip_binder()
.skip_binder()
.inputs()
.get(pos + offset)
&& let ty::Param(_) = arg.kind()
{
let place = &self.move_data.move_paths[mpi].place;
let ty = place.ty(self.body, self.infcx.tcx).ty;

View File

@ -0,0 +1,15 @@
#![allow(dead_code)]
extern "C" {
fn rust_interesting_average(_: i64, ...) -> f64;
}
fn test<T, U>(a: i64, b: i64, c: i64, d: i64, e: i64, f: T, g: U) -> i64 {
unsafe {
rust_interesting_average(
6, a as f64, b, b as f64, f, c as f64, d, d as f64, e, e as f64, f, g, //~ ERROR use of moved value: `f` [E0382]
) as i64
}
}
fn main() {}

View File

@ -0,0 +1,25 @@
error[E0382]: use of moved value: `f`
--> $DIR/move-error-suggest-clone-panic-issue-127915.rs:10:78
|
LL | fn test<T, U>(a: i64, b: i64, c: i64, d: i64, e: i64, f: T, g: U) -> i64 {
| - move occurs because `f` has type `T`, which does not implement the `Copy` trait
...
LL | 6, a as f64, b, b as f64, f, c as f64, d, d as f64, e, e as f64, f, g,
| - value moved here ^ value used here after move
|
help: if `T` implemented `Clone`, you could clone the value
--> $DIR/move-error-suggest-clone-panic-issue-127915.rs:7:9
|
LL | fn test<T, U>(a: i64, b: i64, c: i64, d: i64, e: i64, f: T, g: U) -> i64 {
| ^ consider constraining this type parameter with `Clone`
...
LL | 6, a as f64, b, b as f64, f, c as f64, d, d as f64, e, e as f64, f, g,
| - you could clone this value
help: consider restricting type parameter `T`
|
LL | fn test<T: Copy, U>(a: i64, b: i64, c: i64, d: i64, e: i64, f: T, g: U) -> i64 {
| ++++++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0382`.