Skip to content

Commit

Permalink
Rollup merge of rust-lang#103124 - ldm0:nohard_tests, r=Mark-Simulacrum
Browse files Browse the repository at this point in the history
Add tests for autoderef on block tail

ref: rust-lang#83850 (comment)
  • Loading branch information
matthiaskrgr authored Oct 29, 2022
2 parents 23ff93c + 3e90419 commit 3b12086
Show file tree
Hide file tree
Showing 10 changed files with 149 additions and 0 deletions.
11 changes: 11 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-26978.rs
Original file line number Diff line number Diff line change
@@ -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
}
16 changes: 16 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-26978.stderr
Original file line number Diff line number Diff line change
@@ -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`.
35 changes: 35 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-57749.rs
Original file line number Diff line number Diff line change
@@ -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
}
14 changes: 14 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-57749.stderr
Original file line number Diff line number Diff line change
@@ -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`.
13 changes: 13 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-83783.rs
Original file line number Diff line number Diff line change
@@ -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() { }
12 changes: 12 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-83783.stderr
Original file line number Diff line number Diff line change
@@ -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`.
7 changes: 7 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-83850.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// check-fail
fn f(_: &[i32]) {}

fn main() {
f(&Box::new([1, 2]));
//~^ ERROR mismatched types
}
19 changes: 19 additions & 0 deletions src/test/ui/coercion/coerce-block-tail-83850.stderr
Original file line number Diff line number Diff line change
@@ -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`.
6 changes: 6 additions & 0 deletions src/test/ui/coercion/coerce-block-tail.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// check-fail
fn main() {
let _: &str = & { String::from("hahah")};
let _: &i32 = & { Box::new(1i32) };
//~^ ERROR mismatched types
}
16 changes: 16 additions & 0 deletions src/test/ui/coercion/coerce-block-tail.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 3b12086

Please sign in to comment.