mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-20 02:43:45 +00:00
Rollup merge of #104724 - WaffleLapkin:to_def_idn't, r=compiler-errors
Fix `ClosureKind::to_def_id` `Fn` and `FnOnce` were mixed up in https://github.com/rust-lang/rust/pull/99131.
This commit is contained in:
commit
dcbfb9776d
@ -5,6 +5,7 @@ use crate::{mir, ty};
|
|||||||
|
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
|
use hir::LangItem;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexMap};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
@ -130,11 +131,14 @@ impl<'tcx> ClosureKind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_def_id(&self, tcx: TyCtxt<'_>) -> DefId {
|
pub fn to_def_id(&self, tcx: TyCtxt<'_>) -> DefId {
|
||||||
match self {
|
tcx.require_lang_item(
|
||||||
ClosureKind::Fn => tcx.lang_items().fn_once_trait().unwrap(),
|
match self {
|
||||||
ClosureKind::FnMut => tcx.lang_items().fn_mut_trait().unwrap(),
|
ClosureKind::Fn => LangItem::Fn,
|
||||||
ClosureKind::FnOnce => tcx.lang_items().fn_trait().unwrap(),
|
ClosureKind::FnMut => LangItem::FnMut,
|
||||||
}
|
ClosureKind::FnOnce => LangItem::FnOnce,
|
||||||
|
},
|
||||||
|
None,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,14 +20,23 @@ impl FnOnce<(isize,)> for S {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct F;
|
||||||
|
|
||||||
|
impl FnOnce<(i32,)> for F {
|
||||||
|
type Output = ();
|
||||||
|
|
||||||
|
extern "rust-call" fn call_once(self, args: (i32,)) -> Self::Output {}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut s = S {
|
let mut s = S { x: 3, y: 3 };
|
||||||
x: 3,
|
let ans = s("what");
|
||||||
y: 3,
|
//~^ ERROR mismatched types
|
||||||
};
|
|
||||||
let ans = s("what"); //~ ERROR mismatched types
|
|
||||||
let ans = s();
|
let ans = s();
|
||||||
//~^ ERROR this function takes 1 argument but 0 arguments were supplied
|
//~^ ERROR this function takes 1 argument but 0 arguments were supplied
|
||||||
let ans = s("burma", "shave");
|
let ans = s("burma", "shave");
|
||||||
//~^ ERROR this function takes 1 argument but 2 arguments were supplied
|
//~^ ERROR this function takes 1 argument but 2 arguments were supplied
|
||||||
|
|
||||||
|
F("");
|
||||||
|
//~^ ERROR mismatched types
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/overloaded-calls-bad.rs:28:17
|
--> $DIR/overloaded-calls-bad.rs:33:17
|
||||||
|
|
|
|
||||||
LL | let ans = s("what");
|
LL | let ans = s("what");
|
||||||
| - ^^^^^^ expected `isize`, found `&str`
|
| - ^^^^^^ expected `isize`, found `&str`
|
||||||
@ -13,7 +13,7 @@ LL | impl FnMut<(isize,)> for S {
|
|||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0057]: this function takes 1 argument but 0 arguments were supplied
|
error[E0057]: this function takes 1 argument but 0 arguments were supplied
|
||||||
--> $DIR/overloaded-calls-bad.rs:29:15
|
--> $DIR/overloaded-calls-bad.rs:35:15
|
||||||
|
|
|
|
||||||
LL | let ans = s();
|
LL | let ans = s();
|
||||||
| ^-- an argument of type `isize` is missing
|
| ^-- an argument of type `isize` is missing
|
||||||
@ -29,7 +29,7 @@ LL | let ans = s(/* isize */);
|
|||||||
| ~~~~~~~~~~~~~
|
| ~~~~~~~~~~~~~
|
||||||
|
|
||||||
error[E0057]: this function takes 1 argument but 2 arguments were supplied
|
error[E0057]: this function takes 1 argument but 2 arguments were supplied
|
||||||
--> $DIR/overloaded-calls-bad.rs:31:15
|
--> $DIR/overloaded-calls-bad.rs:37:15
|
||||||
|
|
|
|
||||||
LL | let ans = s("burma", "shave");
|
LL | let ans = s("burma", "shave");
|
||||||
| ^ ------- ------- argument of type `&'static str` unexpected
|
| ^ ------- ------- argument of type `&'static str` unexpected
|
||||||
@ -46,7 +46,21 @@ help: remove the extra argument
|
|||||||
LL | let ans = s(/* isize */);
|
LL | let ans = s(/* isize */);
|
||||||
| ~~~~~~~~~~~~~
|
| ~~~~~~~~~~~~~
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/overloaded-calls-bad.rs:40:7
|
||||||
|
|
|
||||||
|
LL | F("");
|
||||||
|
| - ^^ expected `i32`, found `&str`
|
||||||
|
| |
|
||||||
|
| arguments to this struct are incorrect
|
||||||
|
|
|
||||||
|
note: implementation defined here
|
||||||
|
--> $DIR/overloaded-calls-bad.rs:25:1
|
||||||
|
|
|
||||||
|
LL | impl FnOnce<(i32,)> for F {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0057, E0308.
|
Some errors have detailed explanations: E0057, E0308.
|
||||||
For more information about an error, try `rustc --explain E0057`.
|
For more information about an error, try `rustc --explain E0057`.
|
||||||
|
Loading…
Reference in New Issue
Block a user