// Parse a type
pub fn parse_ty(&mut self) -> PResult<'a, P<Ty>> {
- self.parse_ty_common(true)
+ self.parse_ty_common(true, true)
}
/// Parse a type in restricted contexts where `+` is not permitted.
/// Example 2: `value1 as TYPE + value2`
/// `+` is prohibited to avoid interactions with expression grammar.
fn parse_ty_no_plus(&mut self) -> PResult<'a, P<Ty>> {
- self.parse_ty_common(false)
+ self.parse_ty_common(false, true)
}
- fn parse_ty_common(&mut self, allow_plus: bool) -> PResult<'a, P<Ty>> {
+ fn parse_ty_common(&mut self, allow_plus: bool, allow_qpath_recovery: bool)
+ -> PResult<'a, P<Ty>> {
maybe_whole!(self, NtTy, |x| x);
let lo = self.span;
// Try to recover from use of `+` with incorrect priority.
self.maybe_recover_from_bad_type_plus(allow_plus, &ty)?;
- let ty = self.maybe_recover_from_bad_qpath(ty)?;
+ let ty = self.maybe_recover_from_bad_qpath(ty, allow_qpath_recovery)?;
Ok(P(ty))
}
}
// Try to recover from associated item paths like `[T]::AssocItem`/`(T, U)::AssocItem`.
- fn maybe_recover_from_bad_qpath<T: RecoverQPath>(&mut self, base: T) -> PResult<'a, T> {
+ fn maybe_recover_from_bad_qpath<T: RecoverQPath>(&mut self, base: T, allow_recovery: bool)
+ -> PResult<'a, T> {
// Do not add `::` to expected tokens.
- if self.token != token::ModSep {
+ if !allow_recovery || self.token != token::ModSep {
return Ok(base);
}
let ty = match base.to_ty() {
|p| p.parse_ty())?;
self.bump(); // `)`
let output = if self.eat(&token::RArrow) {
- Some(self.parse_ty_no_plus()?)
+ Some(self.parse_ty_common(false, false)?)
} else {
None
};
}
let expr = Expr { node: ex, span: lo.to(hi), id: ast::DUMMY_NODE_ID, attrs };
- let expr = self.maybe_recover_from_bad_qpath(expr)?;
+ let expr = self.maybe_recover_from_bad_qpath(expr, true)?;
return Ok(P(expr));
}
}
let pat = Pat { node: pat, span: lo.to(self.prev_span), id: ast::DUMMY_NODE_ID };
- let pat = self.maybe_recover_from_bad_qpath(pat)?;
+ let pat = self.maybe_recover_from_bad_qpath(pat, true)?;
Ok(P(pat))
}
--> $DIR/bad-assoc-ty.rs:37:10
|
37 | type G = 'static + (Send)::AssocTy;
- | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `< 'static + Send>::AssocTy`
-
-error: missing angle brackets in associated item path
- --> $DIR/bad-assoc-ty.rs:44:20
- |
-44 | type H = Fn(u8) -> (u8)::Output;
- | ^^^^^^^^^^^^ help: try: `<(u8)>::Output`
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `<'static + Send>::AssocTy`
error[E0223]: ambiguous associated type
--> $DIR/bad-assoc-ty.rs:11:10
= note: specify the type using the syntax `<std::marker::Send + 'static as Trait>::AssocTy`
error[E0223]: ambiguous associated type
- --> $DIR/bad-assoc-ty.rs:44:20
+ --> $DIR/bad-assoc-ty.rs:43:10
|
-44 | type H = Fn(u8) -> (u8)::Output;
- | ^^^^^^^^^^^^ ambiguous associated type
+43 | type H = Fn(u8) -> (u8)::Output;
+ | ^^^^^^^^^^^^^^^^^^^^^^ ambiguous associated type
|
- = note: specify the type using the syntax `<u8 as Trait>::Output`
+ = note: specify the type using the syntax `<std::ops::Fn(u8) -> u8 + 'static as Trait>::Output`
-error: aborting due to 16 previous errors
+error: aborting due to 15 previous errors