Do not eagerly recover for bad impl-trait in macros
This commit is contained in:
parent
bd39bbb4bb
commit
0017822b70
3 changed files with 35 additions and 2 deletions
|
@ -694,8 +694,9 @@ impl<'a> Parser<'a> {
|
||||||
// `where`, so stop if it's it.
|
// `where`, so stop if it's it.
|
||||||
// We also continue if we find types (not traits), again for error recovery.
|
// We also continue if we find types (not traits), again for error recovery.
|
||||||
while self.can_begin_bound()
|
while self.can_begin_bound()
|
||||||
|| self.token.can_begin_type()
|
|| (self.may_recover()
|
||||||
|| (self.token.is_reserved_ident() && !self.token.is_keyword(kw::Where))
|
&& (self.token.can_begin_type()
|
||||||
|
|| (self.token.is_reserved_ident() && !self.token.is_keyword(kw::Where))))
|
||||||
{
|
{
|
||||||
if self.token.is_keyword(kw::Dyn) {
|
if self.token.is_keyword(kw::Dyn) {
|
||||||
// Account for `&dyn Trait + dyn Other`.
|
// Account for `&dyn Trait + dyn Other`.
|
||||||
|
|
15
tests/ui/parser/bad-recover-kw-after-impl.rs
Normal file
15
tests/ui/parser/bad-recover-kw-after-impl.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// 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() {}
|
17
tests/ui/parser/bad-recover-ty-after-impl.rs
Normal file
17
tests/ui/parser/bad-recover-ty-after-impl.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// 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() {}
|
Loading…
Add table
Add a link
Reference in a new issue