return Ok(TokenTree::Token(sp, SpecialVarNt(SpecialMacroVar::CrateMacroVar)));
} else {
sp = mk_sp(sp.lo, self.span.hi);
- self.parse_ident()?
+ self.parse_ident().unwrap_or_else(|mut e| {
+ e.emit();
+ keywords::Invalid.ident()
+ })
}
}
token::SubstNt(name) => {
// and an error emitted then. Thus we don't pop from
// self.open_braces here.
},
- _ => unreachable!(),
+ _ => {}
}
Ok(TokenTree::Delimited(span, Rc::new(Delimited {
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// compile-flags: -Z no-analysis
+
+macro_rules! foo {
+ { $+ } => { //~ ERROR expected identifier, found `+`
+ $(x)(y) //~ ERROR expected `*` or `+`
+ //~^ ERROR no rules expected the token `y`
+ }
+}