Add tests for autoderef on block tail

This commit is contained in:
bogon-right 2022-10-17 04:03:23 +08:00
parent 8be3ce9056
commit 3e90419795
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`.