Forbid attrs on macros, since we don't handle them properly yet.
This commit is contained in:
parent
6174a30d7c
commit
15e03e1e5e
4 changed files with 12 additions and 5 deletions
|
@ -2197,7 +2197,7 @@ impl Parser {
|
||||||
fn check_expected_item(p: Parser, current_attrs: ~[attribute]) {
|
fn check_expected_item(p: Parser, current_attrs: ~[attribute]) {
|
||||||
// If we have attributes then we should have an item
|
// If we have attributes then we should have an item
|
||||||
if vec::is_not_empty(current_attrs) {
|
if vec::is_not_empty(current_attrs) {
|
||||||
p.fatal(~"expected item");
|
p.fatal(~"expected item after attrs");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2210,6 +2210,9 @@ impl Parser {
|
||||||
} else if is_ident(self.token)
|
} else if is_ident(self.token)
|
||||||
&& !self.is_any_keyword(copy self.token)
|
&& !self.is_any_keyword(copy self.token)
|
||||||
&& self.look_ahead(1) == token::NOT {
|
&& self.look_ahead(1) == token::NOT {
|
||||||
|
|
||||||
|
check_expected_item(self, first_item_attrs);
|
||||||
|
|
||||||
// Potential trouble: if we allow macros with paths instead of
|
// Potential trouble: if we allow macros with paths instead of
|
||||||
// idents, we'd need to look ahead past the whole path here...
|
// idents, we'd need to look ahead past the whole path here...
|
||||||
let pth = self.parse_value_path();
|
let pth = self.parse_value_path();
|
||||||
|
@ -2381,7 +2384,7 @@ impl Parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt_mac(m, false) => {
|
stmt_mac(m, _) => {
|
||||||
// Statement macro; might be an expr
|
// Statement macro; might be an expr
|
||||||
match self.token {
|
match self.token {
|
||||||
token::SEMI => {
|
token::SEMI => {
|
||||||
|
@ -3590,6 +3593,10 @@ impl Parser {
|
||||||
&& (is_plain_ident(self.look_ahead(2))
|
&& (is_plain_ident(self.look_ahead(2))
|
||||||
|| self.look_ahead(2) == token::LPAREN
|
|| self.look_ahead(2) == token::LPAREN
|
||||||
|| self.look_ahead(2) == token::LBRACE) {
|
|| self.look_ahead(2) == token::LBRACE) {
|
||||||
|
if attrs.len() > 0 {
|
||||||
|
self.fatal(~"attrs on macros are not yet supported");
|
||||||
|
}
|
||||||
|
|
||||||
// item macro.
|
// item macro.
|
||||||
let pth = self.parse_path_without_tps();
|
let pth = self.parse_path_without_tps();
|
||||||
self.expect(token::NOT);
|
self.expect(token::NOT);
|
||||||
|
|
|
@ -344,7 +344,7 @@ impl ident_interner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Key for thread-local data for sneaking interner information to the
|
/* Key for thread-local data for sneaking interner information to the
|
||||||
* serializer/deserializer. It sounds like a hack because it is one.
|
* serializer/deserializer. It sounds like a hack because it is one.
|
||||||
* Bonus ultra-hack: functions as keys don't work across crates,
|
* Bonus ultra-hack: functions as keys don't work across crates,
|
||||||
* so we have to use a unique number. See taskgroup_key! in task.rs
|
* so we have to use a unique number. See taskgroup_key! in task.rs
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
fn main() {
|
fn main() {
|
||||||
#[attr]
|
#[attr]
|
||||||
debug!("hi"); //~ ERROR expected item
|
debug!("hi"); //~ ERROR expected item after attrs
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
// error-pattern:expected item but found `fmt`
|
// error-pattern:attrs on macros are not yet supported
|
||||||
|
|
||||||
// Don't know how to deal with a syntax extension appearing after an
|
// Don't know how to deal with a syntax extension appearing after an
|
||||||
// item attribute. Probably could use a better error message.
|
// item attribute. Probably could use a better error message.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue