Rollup merge of #78523 - estebank:fix-return-type-parse-regression, r=dtolnay

Revert invalid `fn` return type parsing change

Revert one of the changes in #78379.

Fix #78507.
This commit is contained in:
Yuki Okushi 2020-10-30 18:00:53 +09:00 committed by GitHub
commit 8111706c18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 17 deletions

View File

@ -1666,19 +1666,10 @@ impl<'a> Parser<'a> {
req_name: ReqName,
ret_allow_plus: AllowPlus,
) -> PResult<'a, P<FnDecl>> {
let inputs = self.parse_fn_params(req_name)?;
let output = self.parse_ret_ty(ret_allow_plus, RecoverQPath::Yes)?;
if let ast::FnRetTy::Ty(ty) = &output {
if let TyKind::Path(_, Path { segments, .. }) = &ty.kind {
if let [.., last] = &segments[..] {
// Detect and recover `fn foo() -> Vec<i32>> {}`
self.check_trailing_angle_brackets(last, &[&token::OpenDelim(token::Brace)]);
}
}
}
Ok(P(FnDecl { inputs, output }))
Ok(P(FnDecl {
inputs: self.parse_fn_params(req_name)?,
output: self.parse_ret_ty(ret_allow_plus, RecoverQPath::Yes)?,
}))
}
/// Parses the parameter list of a function, including the `(` and `)` delimiters.

View File

@ -0,0 +1,6 @@
// check-pass
// Regression test for #78507.
fn foo() -> Option<fn() -> Option<bool>> {
Some(|| Some(true))
}
fn main() {}

View File

@ -1,8 +1,8 @@
// Verify that '>' is not both expected and found at the same time, as it used
// to happen in #24780. For example, following should be an error:
// expected one of ..., `>`, ... found `>`. No longer exactly this, but keeping for posterity.
// expected one of ..., `>`, ... found `>`.
fn foo() -> Vec<usize>> { //~ ERROR unmatched angle bracket
fn foo() -> Vec<usize>> { //~ ERROR expected one of `!`, `+`, `::`, `;`, `where`, or `{`, found `>`
Vec::new()
}

View File

@ -1,8 +1,8 @@
error: unmatched angle bracket
error: expected one of `!`, `+`, `::`, `;`, `where`, or `{`, found `>`
--> $DIR/issue-24780.rs:5:23
|
LL | fn foo() -> Vec<usize>> {
| ^^ help: remove extra angle bracket
| ^ expected one of `!`, `+`, `::`, `;`, `where`, or `{`
error: aborting due to previous error