Skip to content

Commit b46bd2f

Browse files
committed
Rollup merge of rust-lang#31152 - durka:ty-follow-bracket, r=pnkfelix
cc rust-lang#31135 rust-lang/rfcs#1462 rust-lang#30923 @retep998 r? @pnkfelix
2 parents faf6d1e + e1e0de8 commit b46bd2f

File tree

3 files changed

+313
-1
lines changed

3 files changed

+313
-1
lines changed

src/libsyntax/ext/tt/macro_rules.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ fn is_in_follow(_: &ExtCtxt, tok: &Token, frag: &str) -> Result<bool, String> {
10051005
},
10061006
"path" | "ty" => {
10071007
match *tok {
1008-
OpenDelim(token::DelimToken::Brace) |
1008+
OpenDelim(token::DelimToken::Brace) | OpenDelim(token::DelimToken::Bracket) |
10091009
Comma | FatArrow | Colon | Eq | Gt | Semi | BinOp(token::Or) => Ok(true),
10101010
Ident(i, _) if (i.name.as_str() == "as" ||
10111011
i.name.as_str() == "where") => Ok(true),

src/test/compile-fail/macro-follow.rs

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
//
11+
// Check the macro follow sets (see corresponding rpass test).
12+
13+
// FOLLOW(pat) = {FatArrow, Comma, Eq, Or, Ident(if), Ident(in)}
14+
macro_rules! follow_pat {
15+
($p:pat ()) => {}; //~WARN `$p:pat` is followed by `(`
16+
($p:pat []) => {}; //~WARN `$p:pat` is followed by `[`
17+
($p:pat {}) => {}; //~WARN `$p:pat` is followed by `{`
18+
($p:pat :) => {}; //~ERROR `$p:pat` is followed by `:`
19+
($p:pat >) => {}; //~ERROR `$p:pat` is followed by `>`
20+
($p:pat +) => {}; //~ERROR `$p:pat` is followed by `+`
21+
($p:pat ident) => {}; //~ERROR `$p:pat` is followed by `ident`
22+
($p:pat $p:pat) => {}; //~ERROR `$p:pat` is followed by `$p:pat`
23+
($p:pat $e:expr) => {}; //~ERROR `$p:pat` is followed by `$e:expr`
24+
($p:pat $t:ty) => {}; //~ERROR `$p:pat` is followed by `$t:ty`
25+
($p:pat $s:stmt) => {}; //~ERROR `$p:pat` is followed by `$s:stmt`
26+
($p:pat $p:path) => {}; //~ERROR `$p:pat` is followed by `$p:path`
27+
($p:pat $b:block) => {}; //~ERROR `$p:pat` is followed by `$b:block`
28+
($p:pat $i:ident) => {}; //~ERROR `$p:pat` is followed by `$i:ident`
29+
($p:pat $t:tt) => {}; //~ERROR `$p:pat` is followed by `$t:tt`
30+
($p:pat $i:item) => {}; //~ERROR `$p:pat` is followed by `$i:item`
31+
($p:pat $m:meta) => {}; //~ERROR `$p:pat` is followed by `$m:meta`
32+
}
33+
// FOLLOW(expr) = {FatArrow, Comma, Semicolon}
34+
macro_rules! follow_expr {
35+
($e:expr ()) => {}; //~WARN `$e:expr` is followed by `(`
36+
($e:expr []) => {}; //~WARN `$e:expr` is followed by `[`
37+
($e:expr {}) => {}; //~WARN `$e:expr` is followed by `{`
38+
($e:expr =) => {}; //~ERROR `$e:expr` is followed by `=`
39+
($e:expr |) => {}; //~ERROR `$e:expr` is followed by `|`
40+
($e:expr :) => {}; //~ERROR `$e:expr` is followed by `:`
41+
($e:expr >) => {}; //~ERROR `$e:expr` is followed by `>`
42+
($e:expr +) => {}; //~ERROR `$e:expr` is followed by `+`
43+
($e:expr ident) => {}; //~ERROR `$e:expr` is followed by `ident`
44+
($e:expr if) => {}; //~ERROR `$e:expr` is followed by `if`
45+
($e:expr in) => {}; //~ERROR `$e:expr` is followed by `in`
46+
($e:expr $p:pat) => {}; //~ERROR `$e:expr` is followed by `$p:pat`
47+
($e:expr $e:expr) => {}; //~ERROR `$e:expr` is followed by `$e:expr`
48+
($e:expr $t:ty) => {}; //~ERROR `$e:expr` is followed by `$t:ty`
49+
($e:expr $s:stmt) => {}; //~ERROR `$e:expr` is followed by `$s:stmt`
50+
($e:expr $p:path) => {}; //~ERROR `$e:expr` is followed by `$p:path`
51+
($e:expr $b:block) => {}; //~ERROR `$e:expr` is followed by `$b:block`
52+
($e:expr $i:ident) => {}; //~ERROR `$e:expr` is followed by `$i:ident`
53+
($e:expr $t:tt) => {}; //~ERROR `$e:expr` is followed by `$t:tt`
54+
($e:expr $i:item) => {}; //~ERROR `$e:expr` is followed by `$i:item`
55+
($e:expr $m:meta) => {}; //~ERROR `$e:expr` is followed by `$m:meta`
56+
}
57+
// FOLLOW(ty) = {OpenDelim(Brace), Comma, FatArrow, Colon, Eq, Gt, Semi, Or,
58+
// Ident(as), Ident(where), OpenDelim(Bracket)}
59+
macro_rules! follow_ty {
60+
($t:ty ()) => {}; //~WARN `$t:ty` is followed by `(`
61+
($t:ty []) => {}; // ok (RFC 1462)
62+
($t:ty +) => {}; //~ERROR `$t:ty` is followed by `+`
63+
($t:ty ident) => {}; //~ERROR `$t:ty` is followed by `ident`
64+
($t:ty if) => {}; //~ERROR `$t:ty` is followed by `if`
65+
($t:ty $p:pat) => {}; //~ERROR `$t:ty` is followed by `$p:pat`
66+
($t:ty $e:expr) => {}; //~ERROR `$t:ty` is followed by `$e:expr`
67+
($t:ty $t:ty) => {}; //~ERROR `$t:ty` is followed by `$t:ty`
68+
($t:ty $s:stmt) => {}; //~ERROR `$t:ty` is followed by `$s:stmt`
69+
($t:ty $p:path) => {}; //~ERROR `$t:ty` is followed by `$p:path`
70+
($t:ty $b:block) => {}; //~ERROR `$t:ty` is followed by `$b:block`
71+
($t:ty $i:ident) => {}; //~ERROR `$t:ty` is followed by `$i:ident`
72+
($t:ty $t:tt) => {}; //~ERROR `$t:ty` is followed by `$t:tt`
73+
($t:ty $i:item) => {}; //~ERROR `$t:ty` is followed by `$i:item`
74+
($t:ty $m:meta) => {}; //~ERROR `$t:ty` is followed by `$m:meta`
75+
}
76+
// FOLLOW(stmt) = FOLLOW(expr)
77+
macro_rules! follow_stmt {
78+
($s:stmt ()) => {}; //~WARN `$s:stmt` is followed by `(`
79+
($s:stmt []) => {}; //~WARN `$s:stmt` is followed by `[`
80+
($s:stmt {}) => {}; //~WARN `$s:stmt` is followed by `{`
81+
($s:stmt =) => {}; //~ERROR `$s:stmt` is followed by `=`
82+
($s:stmt |) => {}; //~ERROR `$s:stmt` is followed by `|`
83+
($s:stmt :) => {}; //~ERROR `$s:stmt` is followed by `:`
84+
($s:stmt >) => {}; //~ERROR `$s:stmt` is followed by `>`
85+
($s:stmt +) => {}; //~ERROR `$s:stmt` is followed by `+`
86+
($s:stmt ident) => {}; //~ERROR `$s:stmt` is followed by `ident`
87+
($s:stmt if) => {}; //~ERROR `$s:stmt` is followed by `if`
88+
($s:stmt in) => {}; //~ERROR `$s:stmt` is followed by `in`
89+
($s:stmt $p:pat) => {}; //~ERROR `$s:stmt` is followed by `$p:pat`
90+
($s:stmt $e:expr) => {}; //~ERROR `$s:stmt` is followed by `$e:expr`
91+
($s:stmt $t:ty) => {}; //~ERROR `$s:stmt` is followed by `$t:ty`
92+
($s:stmt $s:stmt) => {}; //~ERROR `$s:stmt` is followed by `$s:stmt`
93+
($s:stmt $p:path) => {}; //~ERROR `$s:stmt` is followed by `$p:path`
94+
($s:stmt $b:block) => {}; //~ERROR `$s:stmt` is followed by `$b:block`
95+
($s:stmt $i:ident) => {}; //~ERROR `$s:stmt` is followed by `$i:ident`
96+
($s:stmt $t:tt) => {}; //~ERROR `$s:stmt` is followed by `$t:tt`
97+
($s:stmt $i:item) => {}; //~ERROR `$s:stmt` is followed by `$i:item`
98+
($s:stmt $m:meta) => {}; //~ERROR `$s:stmt` is followed by `$m:meta`
99+
}
100+
// FOLLOW(path) = FOLLOW(ty)
101+
macro_rules! follow_path {
102+
($p:path ()) => {}; //~WARN `$p:path` is followed by `(`
103+
($p:path []) => {}; // ok (RFC 1462)
104+
($p:path +) => {}; //~ERROR `$p:path` is followed by `+`
105+
($p:path ident) => {}; //~ERROR `$p:path` is followed by `ident`
106+
($p:path if) => {}; //~ERROR `$p:path` is followed by `if`
107+
($p:path $p:pat) => {}; //~ERROR `$p:path` is followed by `$p:pat`
108+
($p:path $e:expr) => {}; //~ERROR `$p:path` is followed by `$e:expr`
109+
($p:path $t:ty) => {}; //~ERROR `$p:path` is followed by `$t:ty`
110+
($p:path $s:stmt) => {}; //~ERROR `$p:path` is followed by `$s:stmt`
111+
($p:path $p:path) => {}; //~ERROR `$p:path` is followed by `$p:path`
112+
($p:path $b:block) => {}; //~ERROR `$p:path` is followed by `$b:block`
113+
($p:path $i:ident) => {}; //~ERROR `$p:path` is followed by `$i:ident`
114+
($p:path $t:tt) => {}; //~ERROR `$p:path` is followed by `$t:tt`
115+
($p:path $i:item) => {}; //~ERROR `$p:path` is followed by `$i:item`
116+
($p:path $m:meta) => {}; //~ERROR `$p:path` is followed by `$m:meta`
117+
}
118+
// FOLLOW(block) = any token
119+
// FOLLOW(ident) = any token
120+
121+
fn main() {}
122+

src/test/run-pass/macro-follow.rs

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
// Check the macro follow sets (see corresponding cfail test).
12+
13+
// FOLLOW(pat) = {FatArrow, Comma, Eq, Or, Ident(if), Ident(in)}
14+
macro_rules! follow_pat {
15+
($p:pat =>) => {};
16+
($p:pat ,) => {};
17+
($p:pat =) => {};
18+
($p:pat |) => {};
19+
($p:pat if) => {};
20+
($p:pat in) => {};
21+
}
22+
// FOLLOW(expr) = {FatArrow, Comma, Semicolon}
23+
macro_rules! follow_expr {
24+
($e:expr =>) => {};
25+
($e:expr ,) => {};
26+
($e:expr ;) => {};
27+
}
28+
// FOLLOW(ty) = {OpenDelim(Brace), Comma, FatArrow, Colon, Eq, Gt, Semi, Or,
29+
// Ident(as), Ident(where), OpenDelim(Bracket)}
30+
macro_rules! follow_ty {
31+
($t:ty {}) => {};
32+
($t:ty ,) => {};
33+
($t:ty =>) => {};
34+
($t:ty :) => {};
35+
($t:ty =) => {};
36+
($t:ty >) => {};
37+
($t:ty ;) => {};
38+
($t:ty |) => {};
39+
($t:ty as) => {};
40+
($t:ty where) => {};
41+
($t:ty []) => {};
42+
}
43+
// FOLLOW(stmt) = FOLLOW(expr)
44+
macro_rules! follow_stmt {
45+
($s:stmt =>) => {};
46+
($s:stmt ,) => {};
47+
($s:stmt ;) => {};
48+
}
49+
// FOLLOW(path) = FOLLOW(ty)
50+
macro_rules! follow_path {
51+
($p:path {}) => {};
52+
($p:path ,) => {};
53+
($p:path =>) => {};
54+
($p:path :) => {};
55+
($p:path =) => {};
56+
($p:path >) => {};
57+
($p:path ;) => {};
58+
($p:path |) => {};
59+
($p:path as) => {};
60+
($p:path where) => {};
61+
($p:path []) => {};
62+
}
63+
// FOLLOW(block) = any token
64+
macro_rules! follow_block {
65+
($b:block ()) => {};
66+
($b:block []) => {};
67+
($b:block {}) => {};
68+
($b:block ,) => {};
69+
($b:block =>) => {};
70+
($b:block :) => {};
71+
($b:block =) => {};
72+
($b:block >) => {};
73+
($b:block ;) => {};
74+
($b:block |) => {};
75+
($b:block +) => {};
76+
($b:block ident) => {};
77+
($b:block $p:pat) => {};
78+
($b:block $e:expr) => {};
79+
($b:block $t:ty) => {};
80+
($b:block $s:stmt) => {};
81+
($b:block $p:path) => {};
82+
($b:block $b:block) => {};
83+
($b:block $i:ident) => {};
84+
($b:block $t:tt) => {};
85+
($b:block $i:item) => {};
86+
($b:block $m:meta) => {};
87+
}
88+
// FOLLOW(ident) = any token
89+
macro_rules! follow_ident {
90+
($i:ident ()) => {};
91+
($i:ident []) => {};
92+
($i:ident {}) => {};
93+
($i:ident ,) => {};
94+
($i:ident =>) => {};
95+
($i:ident :) => {};
96+
($i:ident =) => {};
97+
($i:ident >) => {};
98+
($i:ident ;) => {};
99+
($i:ident |) => {};
100+
($i:ident +) => {};
101+
($i:ident ident) => {};
102+
($i:ident $p:pat) => {};
103+
($i:ident $e:expr) => {};
104+
($i:ident $t:ty) => {};
105+
($i:ident $s:stmt) => {};
106+
($i:ident $p:path) => {};
107+
($i:ident $b:block) => {};
108+
($i:ident $i:ident) => {};
109+
($i:ident $t:tt) => {};
110+
($i:ident $i:item) => {};
111+
($i:ident $m:meta) => {};
112+
}
113+
// FOLLOW(tt) = any token
114+
macro_rules! follow_tt {
115+
($t:tt ()) => {};
116+
($t:tt []) => {};
117+
($t:tt {}) => {};
118+
($t:tt ,) => {};
119+
($t:tt =>) => {};
120+
($t:tt :) => {};
121+
($t:tt =) => {};
122+
($t:tt >) => {};
123+
($t:tt ;) => {};
124+
($t:tt |) => {};
125+
($t:tt +) => {};
126+
($t:tt ident) => {};
127+
($t:tt $p:pat) => {};
128+
($t:tt $e:expr) => {};
129+
($t:tt $t:ty) => {};
130+
($t:tt $s:stmt) => {};
131+
($t:tt $p:path) => {};
132+
($t:tt $b:block) => {};
133+
($t:tt $i:ident) => {};
134+
($t:tt $t:tt) => {};
135+
($t:tt $i:item) => {};
136+
($t:tt $m:meta) => {};
137+
}
138+
// FOLLOW(item) = any token
139+
macro_rules! follow_item {
140+
($i:item ()) => {};
141+
($i:item []) => {};
142+
($i:item {}) => {};
143+
($i:item ,) => {};
144+
($i:item =>) => {};
145+
($i:item :) => {};
146+
($i:item =) => {};
147+
($i:item >) => {};
148+
($i:item ;) => {};
149+
($i:item |) => {};
150+
($i:item +) => {};
151+
($i:item ident) => {};
152+
($i:item $p:pat) => {};
153+
($i:item $e:expr) => {};
154+
($i:item $t:ty) => {};
155+
($i:item $s:stmt) => {};
156+
($i:item $p:path) => {};
157+
($i:item $b:block) => {};
158+
($i:item $i:ident) => {};
159+
($i:item $t:tt) => {};
160+
($i:item $i:item) => {};
161+
($i:item $m:meta) => {};
162+
}
163+
// FOLLOW(meta) = any token
164+
macro_rules! follow_meta {
165+
($m:meta ()) => {};
166+
($m:meta []) => {};
167+
($m:meta {}) => {};
168+
($m:meta ,) => {};
169+
($m:meta =>) => {};
170+
($m:meta :) => {};
171+
($m:meta =) => {};
172+
($m:meta >) => {};
173+
($m:meta ;) => {};
174+
($m:meta |) => {};
175+
($m:meta +) => {};
176+
($m:meta ident) => {};
177+
($m:meta $p:pat) => {};
178+
($m:meta $e:expr) => {};
179+
($m:meta $t:ty) => {};
180+
($m:meta $s:stmt) => {};
181+
($m:meta $p:path) => {};
182+
($m:meta $b:block) => {};
183+
($m:meta $i:ident) => {};
184+
($m:meta $t:tt) => {};
185+
($m:meta $i:item) => {};
186+
($m:meta $m:meta) => {};
187+
}
188+
189+
fn main() {}
190+

0 commit comments

Comments
 (0)