Skip to content

Commit 45bcb10

Browse files
paulstansifergraydon
authored andcommitted
Forbid item macros from occuring where statement macros might occur, and allow item macros to look like statement/expr macros.
1 parent 0f707f4 commit 45bcb10

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,7 +2253,8 @@ impl Parser {
22532253
22542254
let item_attrs = vec::append(first_item_attrs, item_attrs);
22552255
2256-
match self.parse_item_or_view_item(item_attrs, true, false) {
2256+
match self.parse_item_or_view_item(item_attrs,
2257+
true, false, false) {
22572258
iovi_item(i) => {
22582259
let mut hi = i.span.hi;
22592260
let decl = @spanned(lo, hi, decl_item(i));
@@ -2333,7 +2334,7 @@ impl Parser {
23332334
23342335
let {attrs_remaining, view_items, items: items, _} =
23352336
self.parse_items_and_view_items(first_item_attrs,
2336-
IMPORTS_AND_ITEMS_ALLOWED);
2337+
IMPORTS_AND_ITEMS_ALLOWED, false);
23372338
23382339
for items.each |item| {
23392340
let decl = @spanned(item.span.lo, item.span.hi, decl_item(*item));
@@ -2968,7 +2969,8 @@ impl Parser {
29682969
// Shouldn't be any view items since we've already parsed an item attr
29692970
let {attrs_remaining, view_items, items: starting_items, _} =
29702971
self.parse_items_and_view_items(first_item_attrs,
2971-
VIEW_ITEMS_AND_ITEMS_ALLOWED);
2972+
VIEW_ITEMS_AND_ITEMS_ALLOWED,
2973+
true);
29722974
let mut items: ~[@item] = move starting_items;
29732975
29742976
let mut first = true;
@@ -2980,7 +2982,7 @@ impl Parser {
29802982
}
29812983
debug!("parse_mod_items: parse_item_or_view_item(attrs=%?)",
29822984
attrs);
2983-
match self.parse_item_or_view_item(attrs, true, false) {
2985+
match self.parse_item_or_view_item(attrs, true, false, true) {
29842986
iovi_item(item) => items.push(item),
29852987
iovi_view_item(view_item) => {
29862988
self.span_fatal(view_item.span, ~"view items must be \
@@ -3168,7 +3170,8 @@ impl Parser {
31683170
// Shouldn't be any view items since we've already parsed an item attr
31693171
let {attrs_remaining, view_items, items: _, foreign_items} =
31703172
self.parse_items_and_view_items(first_item_attrs,
3171-
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED);
3173+
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED,
3174+
true);
31723175
31733176
let mut items: ~[@foreign_item] = move foreign_items;
31743177
let mut initial_attrs = attrs_remaining;
@@ -3472,7 +3475,8 @@ impl Parser {
34723475
}
34733476
34743477
fn parse_item_or_view_item(+attrs: ~[attribute], items_allowed: bool,
3475-
foreign_items_allowed: bool)
3478+
foreign_items_allowed: bool,
3479+
macros_allowed: bool)
34763480
-> item_or_view_item {
34773481
assert items_allowed != foreign_items_allowed;
34783482
@@ -3581,20 +3585,22 @@ impl Parser {
35813585
vis: visibility,
35823586
span: mk_sp(lo, self.last_span.hi)
35833587
});
3584-
} else if items_allowed && (!self.is_any_keyword(copy self.token)
3588+
} else if macros_allowed && !self.is_any_keyword(copy self.token)
35853589
&& self.look_ahead(1) == token::NOT
3586-
&& is_plain_ident(self.look_ahead(2))) {
3590+
&& (is_plain_ident(self.look_ahead(2))
3591+
|| self.look_ahead(2) == token::LPAREN
3592+
|| self.look_ahead(2) == token::LBRACE) {
35873593
// item macro.
35883594
let pth = self.parse_path_without_tps();
35893595
self.expect(token::NOT);
35903596
35913597
// a 'special' identifier (like what `macro_rules!` uses)
35923598
// is optional. We should eventually unify invoc syntax
35933599
// and remove this.
3594-
let id = if self.token == token::LPAREN {
3595-
token::special_idents::invalid // no special identifier
3596-
} else {
3600+
let id = if is_plain_ident(self.token) {
35973601
self.parse_ident()
3602+
} else {
3603+
token::special_idents::invalid // no special identifier
35983604
};
35993605
let tts = match self.token {
36003606
token::LPAREN | token::LBRACE => {
@@ -3624,7 +3630,7 @@ impl Parser {
36243630
}
36253631

36263632
fn parse_item(+attrs: ~[attribute]) -> Option<@ast::item> {
3627-
match self.parse_item_or_view_item(attrs, true, false) {
3633+
match self.parse_item_or_view_item(attrs, true, false, true) {
36283634
iovi_none =>
36293635
None,
36303636
iovi_view_item(_) =>
@@ -3762,7 +3768,8 @@ impl Parser {
37623768
}
37633769
37643770
fn parse_items_and_view_items(+first_item_attrs: ~[attribute],
3765-
mode: view_item_parse_mode)
3771+
mode: view_item_parse_mode,
3772+
macros_allowed: bool)
37663773
-> {attrs_remaining: ~[attribute],
37673774
view_items: ~[@view_item],
37683775
items: ~[@item],
@@ -3789,7 +3796,8 @@ impl Parser {
37893796
let (view_items, items, foreign_items) = (DVec(), DVec(), DVec());
37903797
loop {
37913798
match self.parse_item_or_view_item(attrs, items_allowed,
3792-
foreign_items_allowed) {
3799+
foreign_items_allowed,
3800+
macros_allowed) {
37933801
iovi_none =>
37943802
break,
37953803
iovi_view_item(view_item) => {

0 commit comments

Comments
 (0)