mirror of
https://github.com/rust-lang/rust
synced 2024-09-06 01:11:17 +00:00
Fix a error suggestion for E0121 when using placeholder _ as return types on function signature.
Recommit after refactoring based on comment: https://github.com/rust-lang/rust/pull/126017#issuecomment-2189149361 But when changing return type's lifetime to `ReError` will affect the subsequent borrow check process and cause test11 in typeck_type_placeholder_item.rs to lost E0515 message. ```rust fn test11(x: &usize) -> &_ { //~^ ERROR the placeholder `_` is not allowed within types on item signatures for return types &x //~ ERROR cannot return reference to function parameter(this E0515 msg will disappear) } ```
This commit is contained in:
parent
4e63822fc4
commit
50edb32939
|
@ -1459,8 +1459,25 @@ fn infer_return_ty_for_fn_sig<'tcx>(
|
|||
Some(ty) => {
|
||||
let fn_sig = tcx.typeck(def_id).liberated_fn_sigs()[hir_id];
|
||||
// Typeck doesn't expect erased regions to be returned from `type_of`.
|
||||
// This is a heuristic approach. If the scope has region paramters,
|
||||
// we should change fn_sig's lifetime from `ReErased` to `ReError`,
|
||||
// otherwise to `ReStatic`.
|
||||
let has_region_params = generics.params.iter().any(|param| match param.kind {
|
||||
GenericParamKind::Lifetime { .. } => true,
|
||||
_ => false,
|
||||
});
|
||||
let fn_sig = tcx.fold_regions(fn_sig, |r, _| match *r {
|
||||
ty::ReErased => tcx.lifetimes.re_static,
|
||||
ty::ReErased => {
|
||||
if has_region_params {
|
||||
ty::Region::new_error_with_message(
|
||||
tcx,
|
||||
DUMMY_SP,
|
||||
"erased region is not allowed here in return type",
|
||||
)
|
||||
} else {
|
||||
tcx.lifetimes.re_static
|
||||
}
|
||||
}
|
||||
_ => r,
|
||||
});
|
||||
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
//@ run-rustfix
|
||||
|
||||
#[allow(dead_code)]
|
||||
|
||||
fn main() {
|
||||
struct S<'a>(&'a ());
|
||||
|
||||
fn f1(s: S<'_>) -> S<'_> {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
s
|
||||
}
|
||||
|
||||
fn f2(s: S<'_>) -> S<'_> {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
let x = true;
|
||||
if x {
|
||||
s
|
||||
} else {
|
||||
s
|
||||
}
|
||||
}
|
||||
|
||||
fn f3(s: S<'_>) -> S<'_> {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
return s;
|
||||
}
|
||||
|
||||
fn f4(s: S<'_>) -> S<'_> {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
let _x = 1;
|
||||
return s;
|
||||
}
|
||||
}
|
33
tests/ui/return/infer-return-ty-for-fn-sig-issue-125488.rs
Normal file
33
tests/ui/return/infer-return-ty-for-fn-sig-issue-125488.rs
Normal file
|
@ -0,0 +1,33 @@
|
|||
//@ run-rustfix
|
||||
|
||||
#[allow(dead_code)]
|
||||
|
||||
fn main() {
|
||||
struct S<'a>(&'a ());
|
||||
|
||||
fn f1(s: S<'_>) -> _ {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
s
|
||||
}
|
||||
|
||||
fn f2(s: S<'_>) -> _ {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
let x = true;
|
||||
if x {
|
||||
s
|
||||
} else {
|
||||
s
|
||||
}
|
||||
}
|
||||
|
||||
fn f3(s: S<'_>) -> _ {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
return s;
|
||||
}
|
||||
|
||||
fn f4(s: S<'_>) -> _ {
|
||||
//~^ ERROR the placeholder `_` is not allowed
|
||||
let _x = 1;
|
||||
return s;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/infer-return-ty-for-fn-sig-issue-125488.rs:8:24
|
||||
|
|
||||
LL | fn f1(s: S<'_>) -> _ {
|
||||
| ^
|
||||
| |
|
||||
| not allowed in type signatures
|
||||
| help: replace with the correct return type: `S<'_>`
|
||||
|
||||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/infer-return-ty-for-fn-sig-issue-125488.rs:13:24
|
||||
|
|
||||
LL | fn f2(s: S<'_>) -> _ {
|
||||
| ^
|
||||
| |
|
||||
| not allowed in type signatures
|
||||
| help: replace with the correct return type: `S<'_>`
|
||||
|
||||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/infer-return-ty-for-fn-sig-issue-125488.rs:23:24
|
||||
|
|
||||
LL | fn f3(s: S<'_>) -> _ {
|
||||
| ^
|
||||
| |
|
||||
| not allowed in type signatures
|
||||
| help: replace with the correct return type: `S<'_>`
|
||||
|
||||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/infer-return-ty-for-fn-sig-issue-125488.rs:28:24
|
||||
|
|
||||
LL | fn f4(s: S<'_>) -> _ {
|
||||
| ^
|
||||
| |
|
||||
| not allowed in type signatures
|
||||
| help: replace with the correct return type: `S<'_>`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0121`.
|
|
@ -47,7 +47,7 @@ fn test10(&self, _x : _) { }
|
|||
|
||||
fn test11(x: &usize) -> &_ {
|
||||
//~^ ERROR the placeholder `_` is not allowed within types on item signatures for return types
|
||||
&x //~ ERROR cannot return reference to function parameter
|
||||
&x
|
||||
}
|
||||
|
||||
unsafe fn test12(x: *const usize) -> *const *const _ {
|
||||
|
|
|
@ -158,7 +158,7 @@ LL | fn test11(x: &usize) -> &_ {
|
|||
| -^
|
||||
| ||
|
||||
| |not allowed in type signatures
|
||||
| help: replace with the correct return type: `&'static &'static usize`
|
||||
| help: replace with the correct return type: `&&usize`
|
||||
|
||||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for return types
|
||||
--> $DIR/typeck_type_placeholder_item.rs:53:52
|
||||
|
@ -687,13 +687,7 @@ help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
|||
LL + #![feature(const_trait_impl)]
|
||||
|
|
||||
|
||||
error[E0515]: cannot return reference to function parameter `x`
|
||||
--> $DIR/typeck_type_placeholder_item.rs:50:5
|
||||
|
|
||||
LL | &x
|
||||
| ^^ returns a reference to data owned by the current function
|
||||
error: aborting due to 74 previous errors
|
||||
|
||||
error: aborting due to 75 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0015, E0046, E0121, E0282, E0403, E0515.
|
||||
Some errors have detailed explanations: E0015, E0046, E0121, E0282, E0403.
|
||||
For more information about an error, try `rustc --explain E0015`.
|
||||
|
|
Loading…
Reference in a new issue