Rollup merge of #103124 - ldm0:nohard_tests, r=Mark-Simulacrum

Add tests for autoderef on block tail

ref: https://github.com/rust-lang/rust/pull/83850#issuecomment-1270598506
This commit is contained in:
Matthias Krüger 2022-10-30 00:09:24 +02:00 committed by GitHub
commit 3b12086574
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 149 additions and 0 deletions

View File

@ -0,0 +1,11 @@
// check-fail
fn f(_: &i32) {}
fn main() {
let x = Box::new(1i32);
f(&x);
f(&(x));
f(&{x});
//~^ ERROR mismatched types
}

View File

@ -0,0 +1,16 @@
error[E0308]: mismatched types
--> $DIR/coerce-block-tail-26978.rs:9:9
|
LL | f(&{x});
| ^ expected `i32`, found struct `Box`
|
= note: expected type `i32`
found struct `Box<i32>`
help: consider unboxing the value
|
LL | f(&{*x});
| +
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.

View File

@ -0,0 +1,35 @@
// check-fail
use std::ops::Deref;
fn main() {
fn save(who: &str) {
println!("I'll save you, {}!", who);
}
struct Madoka;
impl Deref for Madoka {
type Target = str;
fn deref(&self) -> &Self::Target {
"Madoka"
}
}
save(&{ Madoka });
fn reset(how: &u32) {
println!("Reset {} times", how);
}
struct Homura;
impl Deref for Homura {
type Target = u32;
fn deref(&self) -> &Self::Target {
&42
}
}
reset(&{ Homura });
//~^ ERROR mismatched types
}

View File

@ -0,0 +1,14 @@
error[E0308]: mismatched types
--> $DIR/coerce-block-tail-57749.rs:33:14
|
LL | reset(&{ Homura });
| ^^^^^^ expected `u32`, found struct `Homura`
|
help: consider dereferencing the type
|
LL | reset(&{ *Homura });
| +
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.

View File

@ -0,0 +1,13 @@
// check-fail
// edition:2018
fn _consume_reference<T: ?Sized>(_: &T) {}
async fn _foo() {
_consume_reference::<i32>(&Box::new(7_i32));
_consume_reference::<i32>(&async { Box::new(7_i32) }.await);
//~^ ERROR mismatched types
_consume_reference::<[i32]>(&vec![7_i32]);
_consume_reference::<[i32]>(&async { vec![7_i32] }.await);
}
fn main() { }

View File

@ -0,0 +1,12 @@
error[E0308]: mismatched types
--> $DIR/coerce-block-tail-83783.rs:7:32
|
LL | _consume_reference::<i32>(&async { Box::new(7_i32) }.await);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found struct `Box`
|
= note: expected type `i32`
found struct `Box<i32>`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.

View File

@ -0,0 +1,7 @@
// check-fail
fn f(_: &[i32]) {}
fn main() {
f(&Box::new([1, 2]));
//~^ ERROR mismatched types
}

View File

@ -0,0 +1,19 @@
error[E0308]: mismatched types
--> $DIR/coerce-block-tail-83850.rs:5:7
|
LL | f(&Box::new([1, 2]));
| - ^^^^^^^^^^^^^^^^^ expected slice `[i32]`, found struct `Box`
| |
| arguments to this function are incorrect
|
= note: expected reference `&[i32]`
found reference `&Box<[{integer}; 2]>`
note: function defined here
--> $DIR/coerce-block-tail-83850.rs:2:4
|
LL | fn f(_: &[i32]) {}
| ^ ---------
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.

View File

@ -0,0 +1,6 @@
// check-fail
fn main() {
let _: &str = & { String::from("hahah")};
let _: &i32 = & { Box::new(1i32) };
//~^ ERROR mismatched types
}

View File

@ -0,0 +1,16 @@
error[E0308]: mismatched types
--> $DIR/coerce-block-tail.rs:4:23
|
LL | let _: &i32 = & { Box::new(1i32) };
| ^^^^^^^^^^^^^^ expected `i32`, found struct `Box`
|
= note: expected type `i32`
found struct `Box<i32>`
help: consider unboxing the value
|
LL | let _: &i32 = & { *Box::new(1i32) };
| +
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.