mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Do not report cycle error when inferring return type for suggestion
This commit is contained in:
parent
40336865fe
commit
5309375d2c
@ -4359,6 +4359,7 @@ dependencies = [
|
|||||||
"rustc_serialize",
|
"rustc_serialize",
|
||||||
"rustc_session",
|
"rustc_session",
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
|
"rustc_target",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -770,6 +770,7 @@ rustc_queries! {
|
|||||||
desc { |tcx| "computing function signature of `{}`", tcx.def_path_str(key) }
|
desc { |tcx| "computing function signature of `{}`", tcx.def_path_str(key) }
|
||||||
cache_on_disk_if { key.is_local() }
|
cache_on_disk_if { key.is_local() }
|
||||||
separate_provide_extern
|
separate_provide_extern
|
||||||
|
cycle_delay_bug
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Performs lint checking for the module.
|
/// Performs lint checking for the module.
|
||||||
|
@ -20,6 +20,7 @@ rustc_query_system = { path = "../rustc_query_system" }
|
|||||||
rustc_serialize = { path = "../rustc_serialize" }
|
rustc_serialize = { path = "../rustc_serialize" }
|
||||||
rustc_session = { path = "../rustc_session" }
|
rustc_session = { path = "../rustc_session" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
|
rustc_target = { path = "../rustc_target" }
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
@ -43,3 +43,23 @@ impl<'tcx> Value<'tcx> for AdtSizedConstraint<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Value<'tcx> for ty::Binder<'_, ty::FnSig<'_>> {
|
||||||
|
fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self {
|
||||||
|
let err = tcx.ty_error();
|
||||||
|
// FIXME(compiler-errors): It would be nice if we could get the
|
||||||
|
// query key, so we could at least generate a fn signature that
|
||||||
|
// has the right arity.
|
||||||
|
let fn_sig = ty::Binder::dummy(tcx.mk_fn_sig(
|
||||||
|
[].into_iter(),
|
||||||
|
err,
|
||||||
|
false,
|
||||||
|
rustc_hir::Unsafety::Normal,
|
||||||
|
rustc_target::spec::abi::Abi::Rust,
|
||||||
|
));
|
||||||
|
|
||||||
|
// SAFETY: This is never called when `Self` is not `ty::Binder<'tcx, ty::FnSig<'tcx>>`.
|
||||||
|
// FIXME: Represent the above fact in the trait system somehow.
|
||||||
|
unsafe { std::mem::transmute::<ty::PolyFnSig<'tcx>, ty::Binder<'_, ty::FnSig<'_>>>(fn_sig) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
14
src/test/ui/suggestions/return-cycle-2.rs
Normal file
14
src/test/ui/suggestions/return-cycle-2.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
struct Token<T>(PhantomData<T>);
|
||||||
|
|
||||||
|
impl<T> Token<T> {
|
||||||
|
fn as_ref(_: i32, _: i32) -> _ {
|
||||||
|
//~^ ERROR the placeholder `_` is not allowed within types on item signatures for return types
|
||||||
|
//~| NOTE not allowed in type signatures
|
||||||
|
//~| HELP replace with the correct return type
|
||||||
|
Token(PhantomData::<&T>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
12
src/test/ui/suggestions/return-cycle-2.stderr
Normal file
12
src/test/ui/suggestions/return-cycle-2.stderr
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||||
|
--> $DIR/return-cycle-2.rs:6:34
|
||||||
|
|
|
||||||
|
LL | fn as_ref(_: i32, _: i32) -> _ {
|
||||||
|
| ^
|
||||||
|
| |
|
||||||
|
| not allowed in type signatures
|
||||||
|
| help: replace with the correct return type: `Token<&'static T>`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0121`.
|
14
src/test/ui/suggestions/return-cycle.rs
Normal file
14
src/test/ui/suggestions/return-cycle.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
struct Token<T>(PhantomData<T>);
|
||||||
|
|
||||||
|
impl<T> Token<T> {
|
||||||
|
fn new() -> _ {
|
||||||
|
//~^ ERROR the placeholder `_` is not allowed within types on item signatures for return types
|
||||||
|
//~| NOTE not allowed in type signatures
|
||||||
|
//~| HELP replace with the correct return type
|
||||||
|
Token(PhantomData::<()>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
12
src/test/ui/suggestions/return-cycle.stderr
Normal file
12
src/test/ui/suggestions/return-cycle.stderr
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||||
|
--> $DIR/return-cycle.rs:6:17
|
||||||
|
|
|
||||||
|
LL | fn new() -> _ {
|
||||||
|
| ^
|
||||||
|
| |
|
||||||
|
| not allowed in type signatures
|
||||||
|
| help: replace with the correct return type: `Token<()>`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0121`.
|
Loading…
Reference in New Issue
Block a user