@@ -89,3 +89,223 @@ const _: i32 = -0--1--2;
89
89
"# ] ] ,
90
90
) ;
91
91
}
92
+
93
+ #[ test]
94
+ fn count_basic ( ) {
95
+ check (
96
+ r#"
97
+ macro_rules! m {
98
+ ($($t:ident),*) => {
99
+ ${count(t)}
100
+ }
101
+ }
102
+
103
+ fn test() {
104
+ m!();
105
+ m!(a);
106
+ m!(a, a);
107
+ }
108
+ "# ,
109
+ expect ! [ [ r#"
110
+ macro_rules! m {
111
+ ($($t:ident),*) => {
112
+ ${count(t)}
113
+ }
114
+ }
115
+
116
+ fn test() {
117
+ 0;
118
+ 1;
119
+ 2;
120
+ }
121
+ "# ] ] ,
122
+ ) ;
123
+ }
124
+
125
+ #[ test]
126
+ fn count_with_depth ( ) {
127
+ check (
128
+ r#"
129
+ macro_rules! foo {
130
+ ($( $( $($t:ident)* ),* );*) => {
131
+ $(
132
+ {
133
+ let depth_none = ${count(t)};
134
+ let depth_zero = ${count(t, 0)};
135
+ let depth_one = ${count(t, 1)};
136
+ }
137
+ )*
138
+ }
139
+ }
140
+
141
+ fn bar() {
142
+ foo!(
143
+ a a a, a, a a;
144
+ a a a
145
+ )
146
+ }
147
+ "# ,
148
+ expect ! [ [ r#"
149
+ macro_rules! foo {
150
+ ($( $( $($t:ident)* ),* );*) => {
151
+ $(
152
+ {
153
+ let depth_none = ${count(t)};
154
+ let depth_zero = ${count(t, 0)};
155
+ let depth_one = ${count(t, 1)};
156
+ }
157
+ )*
158
+ }
159
+ }
160
+
161
+ fn bar() {
162
+ {
163
+ let depth_none = 6;
164
+ let depth_zero = 3;
165
+ let depth_one = 6;
166
+ } {
167
+ let depth_none = 3;
168
+ let depth_zero = 1;
169
+ let depth_one = 3;
170
+ }
171
+ }
172
+ "# ] ] ,
173
+ ) ;
174
+ }
175
+
176
+ #[ test]
177
+ fn count_depth_out_of_bounds ( ) {
178
+ check (
179
+ r#"
180
+ macro_rules! foo {
181
+ ($($t:ident)*) => { ${count(t, 1)} };
182
+ ($( $( $l:literal )* );*) => { $(${count(l, 1)};)* }
183
+ }
184
+ macro_rules! bar {
185
+ ($($t:ident)*) => { ${count(t, 1024)} };
186
+ ($( $( $l:literal )* );*) => { $(${count(l, 8192)};)* }
187
+ }
188
+
189
+ fn test() {
190
+ foo!(a b);
191
+ foo!(1 2; 3);
192
+ bar!(a b);
193
+ bar!(1 2; 3);
194
+ }
195
+ "# ,
196
+ expect ! [ [ r#"
197
+ macro_rules! foo {
198
+ ($($t:ident)*) => { ${count(t, 1)} };
199
+ ($( $( $l:literal )* );*) => { $(${count(l, 1)};)* }
200
+ }
201
+ macro_rules! bar {
202
+ ($($t:ident)*) => { ${count(t, 1024)} };
203
+ ($( $( $l:literal )* );*) => { $(${count(l, 8192)};)* }
204
+ }
205
+
206
+ fn test() {
207
+ /* error: ${count} out of bounds */;
208
+ /* error: ${count} out of bounds */;
209
+ /* error: ${count} out of bounds */;
210
+ /* error: ${count} out of bounds */;
211
+ }
212
+ "# ] ] ,
213
+ ) ;
214
+ }
215
+
216
+ #[ test]
217
+ fn misplaced_count ( ) {
218
+ check (
219
+ r#"
220
+ macro_rules! foo {
221
+ ($($t:ident)*) => { $(${count(t)})* };
222
+ ($l:literal) => { ${count(l)} }
223
+ }
224
+
225
+ fn test() {
226
+ foo!(a b c);
227
+ foo!(1);
228
+ }
229
+ "# ,
230
+ expect ! [ [ r#"
231
+ macro_rules! foo {
232
+ ($($t:ident)*) => { $(${count(t)})* };
233
+ ($l:literal) => { ${count(l)} }
234
+ }
235
+
236
+ fn test() {
237
+ /* error: ${count} misplaced */;
238
+ /* error: ${count} misplaced */;
239
+ }
240
+ "# ] ] ,
241
+ ) ;
242
+ }
243
+
244
+ #[ test]
245
+ fn malformed_count ( ) {
246
+ check (
247
+ r#"
248
+ macro_rules! too_many_args {
249
+ ($($t:ident)*) => { ${count(t, 1, leftover)} }
250
+ }
251
+ macro_rules! depth_suffixed {
252
+ ($($t:ident)*) => { ${count(t, 0usize)} }
253
+ }
254
+ macro_rules! depth_too_large {
255
+ ($($t:ident)*) => { ${count(t, 18446744073709551616)} }
256
+ }
257
+
258
+ fn test() {
259
+ too_many_args!();
260
+ depth_suffixed!();
261
+ depth_too_large!();
262
+ }
263
+ "# ,
264
+ expect ! [ [ r#"
265
+ macro_rules! too_many_args {
266
+ ($($t:ident)*) => { ${count(t, 1, leftover)} }
267
+ }
268
+ macro_rules! depth_suffixed {
269
+ ($($t:ident)*) => { ${count(t, 0usize)} }
270
+ }
271
+ macro_rules! depth_too_large {
272
+ ($($t:ident)*) => { ${count(t, 18446744073709551616)} }
273
+ }
274
+
275
+ fn test() {
276
+ /* error: invalid macro definition: invalid metavariable expression */;
277
+ /* error: invalid macro definition: invalid metavariable expression */;
278
+ /* error: invalid macro definition: invalid metavariable expression */;
279
+ }
280
+ "# ] ] ,
281
+ ) ;
282
+ }
283
+
284
+ #[ test]
285
+ fn count_interaction_with_empty_binding ( ) {
286
+ // FIXME: Should this error? rustc currently accepts it.
287
+ check (
288
+ r#"
289
+ macro_rules! m {
290
+ ($($t:ident),*) => {
291
+ ${count(t, 100)}
292
+ }
293
+ }
294
+
295
+ fn test() {
296
+ m!();
297
+ }
298
+ "# ,
299
+ expect ! [ [ r#"
300
+ macro_rules! m {
301
+ ($($t:ident),*) => {
302
+ ${count(t, 100)}
303
+ }
304
+ }
305
+
306
+ fn test() {
307
+ 0;
308
+ }
309
+ "# ] ] ,
310
+ ) ;
311
+ }
0 commit comments