Rollup merge of #104956 - mucinoab:issue-104870, r=compiler-errors
Avoid ICE if the Clone trait is not found while building error suggestions Fixes #104870 r? `@compiler-errors`
This commit is contained in:
commit
db2850c1fb
3 changed files with 50 additions and 7 deletions
|
@ -732,9 +732,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
let tcx = self.infcx.tcx;
|
let tcx = self.infcx.tcx;
|
||||||
// Try to find predicates on *generic params* that would allow copying `ty`
|
// Try to find predicates on *generic params* that would allow copying `ty`
|
||||||
let infcx = tcx.infer_ctxt().build();
|
let infcx = tcx.infer_ctxt().build();
|
||||||
if infcx
|
|
||||||
|
if let Some(clone_trait_def) = tcx.lang_items().clone_trait()
|
||||||
|
&& infcx
|
||||||
.type_implements_trait(
|
.type_implements_trait(
|
||||||
tcx.lang_items().clone_trait().unwrap(),
|
clone_trait_def,
|
||||||
[tcx.erase_regions(ty)],
|
[tcx.erase_regions(ty)],
|
||||||
self.param_env,
|
self.param_env,
|
||||||
)
|
)
|
||||||
|
|
20
src/test/ui/lang-items/missing-clone-for-suggestion.rs
Normal file
20
src/test/ui/lang-items/missing-clone-for-suggestion.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Avoid panicking if the Clone trait is not found while building error suggestions
|
||||||
|
// See #104870
|
||||||
|
|
||||||
|
#![feature(no_core, lang_items)]
|
||||||
|
#![no_core]
|
||||||
|
|
||||||
|
#[lang = "sized"]
|
||||||
|
trait Sized {}
|
||||||
|
|
||||||
|
#[lang = "copy"]
|
||||||
|
trait Copy {}
|
||||||
|
|
||||||
|
fn g<T>(x: T) {}
|
||||||
|
|
||||||
|
fn f(x: *mut u8) {
|
||||||
|
g(x);
|
||||||
|
g(x); //~ ERROR use of moved value: `x`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
21
src/test/ui/lang-items/missing-clone-for-suggestion.stderr
Normal file
21
src/test/ui/lang-items/missing-clone-for-suggestion.stderr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
error[E0382]: use of moved value: `x`
|
||||||
|
--> $DIR/missing-clone-for-suggestion.rs:17:7
|
||||||
|
|
|
||||||
|
LL | fn f(x: *mut u8) {
|
||||||
|
| - move occurs because `x` has type `*mut u8`, which does not implement the `Copy` trait
|
||||||
|
LL | g(x);
|
||||||
|
| - value moved here
|
||||||
|
LL | g(x);
|
||||||
|
| ^ value used here after move
|
||||||
|
|
|
||||||
|
note: consider changing this parameter type in function `g` to borrow instead if owning the value isn't necessary
|
||||||
|
--> $DIR/missing-clone-for-suggestion.rs:13:12
|
||||||
|
|
|
||||||
|
LL | fn g<T>(x: T) {}
|
||||||
|
| - ^ this parameter takes ownership of the value
|
||||||
|
| |
|
||||||
|
| in this function
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0382`.
|
Loading…
Add table
Add a link
Reference in a new issue