// `where`, so stop if it's it.
// We also continue if we find types (not traits), again for error recovery.
while self.can_begin_bound()
- || self.token.can_begin_type()
- || (self.token.is_reserved_ident() && !self.token.is_keyword(kw::Where))
+ || (self.may_recover()
+ && (self.token.can_begin_type()
+ || (self.token.is_reserved_ident() && !self.token.is_keyword(kw::Where))))
{
if self.token.is_keyword(kw::Dyn) {
// Account for `&dyn Trait + dyn Other`.
--- /dev/null
+// check-pass
+
+// edition:2021
+// for the `impl` + keyword test
+
+macro_rules! impl_primitive {
+ ($ty:ty) => {
+ compile_error!("whoops");
+ };
+ (impl async) => {};
+}
+
+impl_primitive!(impl async);
+
+fn main() {}
--- /dev/null
+// check-pass
+
+macro_rules! impl_primitive {
+ ($ty:ty) => { impl_primitive!(impl $ty); };
+ (impl $ty:ty) => { fn a(_: $ty) {} }
+}
+
+impl_primitive! { u8 }
+
+macro_rules! test {
+ ($ty:ty) => { compile_error!("oh no"); };
+ (impl &) => {};
+}
+
+test!(impl &);
+
+fn main() {}