-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #71599 - ldm0:fnclo, r=nikomatsakis
Support coercion between (FnDef | Closure) and (FnDef | Closure) Fixes #46742, fixes #48109 Inject `Closure` into the `FnDef x FnDef` coercion special case, which makes coercion of `(FnDef | Closure) x (FnDef | Closure)` possible, where closures should be **non-capturing**.
- Loading branch information
Showing
14 changed files
with
512 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
fn add(a: i32, b: i32) -> i32 { | ||
a + b | ||
} | ||
fn main() { | ||
// We shouldn't coerce capturing closure to a function | ||
let cap = 0; | ||
let _ = match "+" { | ||
"+" => add, | ||
"-" => |a, b| (a - b + cap) as i32, | ||
_ => unimplemented!(), | ||
}; | ||
//~^^^ ERROR `match` arms have incompatible types | ||
|
||
|
||
// We shouldn't coerce capturing closure to a non-capturing closure | ||
let _ = match "+" { | ||
"+" => |a, b| (a + b) as i32, | ||
"-" => |a, b| (a - b + cap) as i32, | ||
_ => unimplemented!(), | ||
}; | ||
//~^^^ ERROR `match` arms have incompatible types | ||
|
||
|
||
// We shouldn't coerce non-capturing closure to a capturing closure | ||
let _ = match "+" { | ||
"+" => |a, b| (a + b + cap) as i32, | ||
"-" => |a, b| (a - b) as i32, | ||
_ => unimplemented!(), | ||
}; | ||
//~^^^ ERROR `match` arms have incompatible types | ||
|
||
// We shouldn't coerce capturing closure to a capturing closure | ||
let _ = match "+" { | ||
"+" => |a, b| (a + b + cap) as i32, | ||
"-" => |a, b| (a - b + cap) as i32, | ||
_ => unimplemented!(), | ||
}; | ||
//~^^^ ERROR `match` arms have incompatible types | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
error[E0308]: `match` arms have incompatible types | ||
--> $DIR/closure_cap_coerce_many_fail.rs:9:16 | ||
| | ||
LL | let _ = match "+" { | ||
| _____________- | ||
LL | | "+" => add, | ||
| | --- this is found to be of type `fn(i32, i32) -> i32 {add}` | ||
LL | | "-" => |a, b| (a - b + cap) as i32, | ||
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected fn item, found closure | ||
LL | | _ => unimplemented!(), | ||
LL | | }; | ||
| |_____- `match` arms have incompatible types | ||
| | ||
= note: expected type `fn(i32, i32) -> i32 {add}` | ||
found closure `[closure@$DIR/closure_cap_coerce_many_fail.rs:9:16: 9:43 cap:_]` | ||
|
||
error[E0308]: `match` arms have incompatible types | ||
--> $DIR/closure_cap_coerce_many_fail.rs:18:16 | ||
| | ||
LL | let _ = match "+" { | ||
| _____________- | ||
LL | | "+" => |a, b| (a + b) as i32, | ||
| | --------------------- this is found to be of type `[closure@$DIR/closure_cap_coerce_many_fail.rs:17:16: 17:37]` | ||
LL | | "-" => |a, b| (a - b + cap) as i32, | ||
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected closure, found a different closure | ||
LL | | _ => unimplemented!(), | ||
LL | | }; | ||
| |_____- `match` arms have incompatible types | ||
| | ||
= note: expected type `[closure@$DIR/closure_cap_coerce_many_fail.rs:17:16: 17:37]` | ||
found closure `[closure@$DIR/closure_cap_coerce_many_fail.rs:18:16: 18:43 cap:_]` | ||
= note: no two closures, even if identical, have the same type | ||
= help: consider boxing your closure and/or using it as a trait object | ||
|
||
error[E0308]: `match` arms have incompatible types | ||
--> $DIR/closure_cap_coerce_many_fail.rs:27:16 | ||
| | ||
LL | let _ = match "+" { | ||
| _____________- | ||
LL | | "+" => |a, b| (a + b + cap) as i32, | ||
| | --------------------------- this is found to be of type `[closure@$DIR/closure_cap_coerce_many_fail.rs:26:16: 26:43 cap:_]` | ||
LL | | "-" => |a, b| (a - b) as i32, | ||
| | ^^^^^^^^^^^^^^^^^^^^^ expected closure, found a different closure | ||
LL | | _ => unimplemented!(), | ||
LL | | }; | ||
| |_____- `match` arms have incompatible types | ||
| | ||
= note: expected type `[closure@$DIR/closure_cap_coerce_many_fail.rs:26:16: 26:43 cap:_]` | ||
found closure `[closure@$DIR/closure_cap_coerce_many_fail.rs:27:16: 27:37]` | ||
= note: no two closures, even if identical, have the same type | ||
= help: consider boxing your closure and/or using it as a trait object | ||
|
||
error[E0308]: `match` arms have incompatible types | ||
--> $DIR/closure_cap_coerce_many_fail.rs:35:16 | ||
| | ||
LL | let _ = match "+" { | ||
| _____________- | ||
LL | | "+" => |a, b| (a + b + cap) as i32, | ||
| | --------------------------- this is found to be of type `[closure@$DIR/closure_cap_coerce_many_fail.rs:34:16: 34:43 cap:_]` | ||
LL | | "-" => |a, b| (a - b + cap) as i32, | ||
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected closure, found a different closure | ||
LL | | _ => unimplemented!(), | ||
LL | | }; | ||
| |_____- `match` arms have incompatible types | ||
| | ||
= note: expected type `[closure@$DIR/closure_cap_coerce_many_fail.rs:34:16: 34:43 cap:_]` | ||
found closure `[closure@$DIR/closure_cap_coerce_many_fail.rs:35:16: 35:43 cap:_]` | ||
= note: no two closures, even if identical, have the same type | ||
= help: consider boxing your closure and/or using it as a trait object | ||
|
||
error: aborting due to 4 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0308`. |
Oops, something went wrong.