Change:
<!-- Thank you for filing a bug report! Please provide a short summary of the bug, along with any information you feel relevant to replicating the bug. If you cannot produce a minimal reproduction case (something that would work in isolation), please provide the steps or even link to a repository that causes the problematic output to occur. --I tried this almost-correct code: The current output is: <!-- The following is not always necessary. --Ideally the output should look like: <!-- If the problem is not self-explanatory, please provide a rationale for the change. --<!-- If dramatically different output is caused by small changes, consider also adding them here. If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. The output might also be different depending on the Edition. --<!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
claim

Discussion:
}; let (pat, ty) = if is_name_required || this.is_named_param() { debug!("parse_param_general parse_pat (is_name_required:{})", is_name_required); let (pat, colon) = this.parse_fn_param_pat_colon()?; if !colon { let mut err = this.unexpected::<()>().unwrap_err();

/// Parses an `impl B0 + ... + Bn` type. fn parse_impl_ty(&mut self, impl_dyn_multi: &mut bool) -> PResult<'a, TyKind> { // Always parse bounds greedily for better error recovery. <ins> if self.token.is_lifetime() { self.look_ahead(1, |t| { if let token::Ident(symname, _) = t.kind { // parse pattern with "'a Sized" we're supposed to give suggestion like // "'a + Sized" self.struct_span_err( self.token.span, &format!("expected `+` between lifetime and {}", symname), ) .span_suggestion_verbose( self.token.span.shrink_to_hi(), "add `+`", " +", Applicability::MaybeIncorrect, ) .emit(); } }) } </ins> let bounds = self.parse_generic_bounds(None)?; *impl_dyn_multi = bounds.len() > 1 || self.prev_token.kind == TokenKind::BinOp(token::Plus); Ok(TyKind::ImplTrait(ast::DUMMY_NODE_ID, bounds))

<ins> fn foo<'a>(_: impl 'a Sized) {} //~^ ERROR: expected `+` between lifetime and Sized //~| ERROR: expected one of `:`, `@`, or `|`, found `)` //~| ERROR: expected one of `)`, `+`, or `,`, found `Sized` //~| ERROR: at least one trait must be specified fn main(){ } </ins>

<ins> error: expected `+` between lifetime and Sized --> $DIR/issue-102598.rs:1:20 | LL | fn foo<'a>(_: impl 'a Sized) {} |                    ^^ | help: add `+` | LL | fn foo<'a>(_: impl 'a + Sized) {} |                       + error: expected one of `:`, `@`, or `|`, found `)` --> $DIR/issue-102598.rs:1:28 | LL | fn foo<'a>(_: impl 'a Sized) {} |                            ^ expected one of `:`, `@`, or `|` | = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) help: if this is a parameter name, give it a type | LL | fn foo<'a>(_: impl 'a Sized: TypeName) {} |                            ++++++++++ help: if this is a type, explicitly ignore the parameter name | LL | fn foo<'a>(_: impl 'a _: Sized) {} |                       ++ error: expected one of `)`, `+`, or `,`, found `Sized` --> $DIR/issue-102598.rs:1:23 | LL | fn foo<'a>(_: impl 'a Sized) {} |                      -^^^^^ expected one of `)`, `+`, or `,` |                      | |                      help: missing `,` error: at least one trait must be specified --> $DIR/issue-102598.rs:1:15 | LL | fn foo<'a>(_: impl 'a Sized) {} |               ^^^^^^^ error: aborting due to 4 previous errors </ins>