diff options
| author | bors <bors@rust-lang.org> | 2021-10-01 17:17:43 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-10-01 17:17:43 +0000 |
| commit | b6057bf7b7ee7c58e6a39ead02eaa13b75f908c2 (patch) | |
| tree | 0e8e802c3a63ccb92171d9385c718eaa16340de5 /compiler/rustc_parse/src | |
| parent | ed937594d3912ced11f6f35a90bb8bf591909d2a (diff) | |
| parent | 534946cba101325387a213d37dd9a1d30f08660c (diff) | |
| download | rust-b6057bf7b7ee7c58e6a39ead02eaa13b75f908c2.tar.gz rust-b6057bf7b7ee7c58e6a39ead02eaa13b75f908c2.zip | |
Auto merge of #89435 - Manishearth:rollup-vh2ih7k, r=Manishearth
Rollup of 6 pull requests Successful merges: - #87868 (Added -Z randomize-layout flag) - #88820 (Add `pie` as another `relocation-model` value) - #89029 (feat(rustc_parse): recover from pre-RFC-2000 const generics syntax) - #89322 (Reapply "Remove optimization_fuel_crate from Session") - #89340 (Improve error message for `printf`-style format strings) - #89415 (Correct caller/callsite confusion in inliner message) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_parse/src')
| -rw-r--r-- | compiler/rustc_parse/src/parser/path.rs | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/compiler/rustc_parse/src/parser/path.rs b/compiler/rustc_parse/src/parser/path.rs index 953c6915068..c7d080a80fe 100644 --- a/compiler/rustc_parse/src/parser/path.rs +++ b/compiler/rustc_parse/src/parser/path.rs @@ -495,20 +495,28 @@ impl<'a> Parser<'a> { None => { let after_eq = eq.shrink_to_hi(); let before_next = self.token.span.shrink_to_lo(); - self.struct_span_err(after_eq.to(before_next), "missing type to the right of `=`") - .span_suggestion( + let mut err = self + .struct_span_err(after_eq.to(before_next), "missing type to the right of `=`"); + if matches!(self.token.kind, token::Comma | token::Gt) { + err.span_suggestion( self.sess.source_map().next_point(eq).to(before_next), "to constrain the associated type, add a type after `=`", " TheType".to_string(), Applicability::HasPlaceholders, - ) - .span_suggestion( + ); + err.span_suggestion( eq.to(before_next), &format!("remove the `=` if `{}` is a type", ident), String::new(), Applicability::MaybeIncorrect, ) - .emit(); + } else { + err.span_label( + self.token.span, + &format!("expected type, found {}", super::token_descr(&self.token)), + ) + }; + return Err(err); } } Ok(self.mk_ty(span, ast::TyKind::Err)) @@ -572,6 +580,25 @@ impl<'a> Parser<'a> { return self.recover_const_arg(start, err).map(Some); } } + } else if self.eat_keyword_noexpect(kw::Const) { + // Detect and recover from the old, pre-RFC2000 syntax for const generics. + let mut err = self.struct_span_err( + start, + "expected lifetime, type, or constant, found keyword `const`", + ); + if self.check_const_arg() { + err.span_suggestion_verbose( + start.until(self.token.span), + "the `const` keyword is only needed in the definition of the type", + String::new(), + Applicability::MaybeIncorrect, + ); + err.emit(); + GenericArg::Const(self.parse_const_arg()?) + } else { + let after_kw_const = self.token.span; + return self.recover_const_arg(after_kw_const, err).map(Some); + } } else { return Ok(None); }; |
