]> git.saurik.com Git - bison.git/blame - tests/input.at
Revert 2009-12-30 change for undefined %prec token complaints.
[bison.git] / tests / input.at
CommitLineData
087b9fdf 1# Checking the Bison scanner. -*- Autotest -*-
e141f4d4 2# Copyright (C) 2002-2010 Free Software Foundation, Inc.
9b2d0677 3
f16b0819 4# This program is free software: you can redistribute it and/or modify
9b2d0677 5# it under the terms of the GNU General Public License as published by
f16b0819
PE
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9b2d0677
AD
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
f16b0819 13#
9b2d0677 14# You should have received a copy of the GNU General Public License
f16b0819 15# along with this program. If not, see <http://www.gnu.org/licenses/>.
9b2d0677
AD
16
17AT_BANNER([[Input Processing.]])
18
19# Mostly test that we are robust to mistakes.
20
6c35d22c 21
9b2d0677
AD
22## ------------ ##
23## Invalid $n. ##
24## ------------ ##
25
287b314e 26AT_SETUP([Invalid $n and @n])
9b2d0677
AD
27
28AT_DATA([input.y],
29[[%%
bfcf1f3a 30exp: { $$ = $1 ; };
bfcf1f3a 31exp: { @$ = @1 ; };
9b2d0677
AD
32]])
33
da730230 34AT_BISON_CHECK([input.y], [1], [],
e9071366
AD
35[[input.y:2.13-14: integer out of range: `$1'
36input.y:3.13-14: integer out of range: `@1'
9b2d0677
AD
37]])
38
39AT_CLEANUP
9af3fbce
AD
40
41
42## -------------- ##
e776192e 43## Type Clashes. ##
9af3fbce
AD
44## -------------- ##
45
e776192e 46AT_SETUP([Type Clashes])
9af3fbce
AD
47
48AT_DATA([input.y],
ffa4ba3a
JD
49[[%union { int bar; }
50%token foo
9af3fbce
AD
51%type <bar> exp
52%%
ffa4ba3a 53exp: foo { $$; } foo { $2; } foo
9af3fbce
AD
54 | foo
55 | /* Empty. */
56 ;
57]])
58
da730230 59AT_BISON_CHECK([input.y], [1], [],
ffa4ba3a
JD
60[[input.y:5.12-13: $$ for the midrule at $2 of `exp' has no declared type
61input.y:5.24-25: $2 of `exp' has no declared type
62input.y:5.6-32: warning: type clash on default action: <bar> != <>
63input.y:6.6-8: warning: type clash on default action: <bar> != <>
64input.y:7.5: warning: empty rule for typed nonterminal, and no action
9af3fbce
AD
65]])
66
67AT_CLEANUP
5a08f1ce
AD
68
69
ffa4ba3a 70# _AT_UNUSED_VALUES_DECLARATIONS()
dab244d5 71# --------------------------------
ffa4ba3a
JD
72# Generate the token, type, and destructor
73# declarations for the unused values tests.
ffa4ba3a
JD
74m4_define([_AT_UNUSED_VALUES_DECLARATIONS],
75[[[%token <integer> INT;
76%type <integer> a b c d e f g h i j k l;
77%destructor { destroy ($$); } INT a b c d e f g h i j k l;]]])
378f4bd8 78
ffa4ba3a 79
17bd8a73 80# AT_CHECK_UNUSED_VALUES(DECLARATIONS_AFTER, CHECK_MIDRULE_VALUES)
dab244d5
AD
81# ----------------------------------------------------------------
82# Generate a grammar to test unused values, compile it, run it. If
83# DECLARATIONS_AFTER is set, then the token, type, and destructor
84# declarations are generated after the rules rather than before. If
85# CHECK_MIDRULE_VALUES is set, then --warnings=midrule-values is set.
ffa4ba3a
JD
86m4_define([AT_CHECK_UNUSED_VALUES],
87[AT_DATA([input.y],
88m4_ifval($1, [
89
90
91], [_AT_UNUSED_VALUES_DECLARATIONS
92])[[%%
27622431 93start:
e8cd1ad6
DJ
94 'a' a { $]2[; } | 'b' b { $]2[; } | 'c' c { $]2[; } | 'd' d { $]2[; }
95| 'e' e { $]2[; } | 'f' f { $]2[; } | 'g' g { $]2[; } | 'h' h { $]2[; }
96| 'i' i { $]2[; } | 'j' j { $]2[; } | 'k' k { $]2[; } | 'l' l { $]2[; }
378f4bd8 97;
27622431
PE
98
99a: INT | INT { } INT { } INT { };
100b: INT | /* empty */;
e8cd1ad6
DJ
101c: INT | INT { $]1[; } INT { $<integer>2; } INT { $<integer>4; };
102d: INT | INT { } INT { $]1[; } INT { $<integer>2; };
103e: INT | INT { } INT { } INT { $]1[; };
ffa4ba3a 104f: INT | INT { } INT { } INT { $]$[ = $]1[ + $]3[ + $]5[; };
ddc8ede1
PE
105g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
106h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
ffa4ba3a
JD
107i: INT | INT INT { } { $]$[ = $]1[ + $]2[; };
108j: INT | INT INT { $<integer>$ = 1; } { $]$[ = $]1[ + $]2[; };
ddc8ede1
PE
109k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
110l: INT | INT { $<integer>$ = $<integer>1; } INT { $<integer>$ = $<integer>2 + $<integer>3; } INT { $<integer>$ = $<integer>4 + $<integer>5; };]]m4_ifval($1, [
ffa4ba3a
JD
111_AT_UNUSED_VALUES_DECLARATIONS])
112)
113
da730230 114AT_BISON_CHECK(m4_ifval($2, [ --warnings=midrule-values ])[ input.y], [0], [],
ffa4ba3a
JD
115[[input.y:11.10-32: warning: unset value: $]$[
116input.y:11.10-32: warning: unused value: $]1[
117input.y:11.10-32: warning: unused value: $]3[
118input.y:11.10-32: warning: unused value: $]5[
119input.y:12.9: warning: empty rule for typed nonterminal, and no action
e8cd1ad6
DJ
120]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $$
121input.y:13.26-41: warning: unset value: $$
122]]])[[input.y:13.10-62: warning: unset value: $]$[
123input.y:13.10-62: warning: unused value: $]3[
124input.y:13.10-62: warning: unused value: $]5[
17bd8a73 125]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $$
e8cd1ad6
DJ
126]]])[[input.y:14.10-49: warning: unset value: $]$[
127input.y:14.10-49: warning: unused value: $]3[
128input.y:14.10-49: warning: unused value: $]5[
129input.y:15.10-37: warning: unset value: $]$[
130input.y:15.10-37: warning: unused value: $]3[
131input.y:15.10-37: warning: unused value: $]5[
ddc8ede1
PE
132input.y:17.10-58: warning: unset value: $]$[
133input.y:17.10-58: warning: unused value: $]1[
17bd8a73
JD
134]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]2[
135]]])[[input.y:17.10-58: warning: unused value: $]3[
136]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]4[
137]]])[[input.y:17.10-58: warning: unused value: $]5[
ddc8ede1
PE
138input.y:18.10-72: warning: unset value: $]$[
139input.y:18.10-72: warning: unused value: $]1[
140input.y:18.10-72: warning: unused value: $]3[
17bd8a73
JD
141]]m4_ifval($2, [[[input.y:18.10-72: warning: unused value: $]4[
142]]])[[input.y:18.10-72: warning: unused value: $]5[
143]]m4_ifval($2, [[[input.y:20.10-55: warning: unused value: $]3[
144]]])[[input.y:21.10-68: warning: unset value: $]$[
ddc8ede1
PE
145input.y:21.10-68: warning: unused value: $]1[
146input.y:21.10-68: warning: unused value: $]2[
17bd8a73
JD
147]]m4_ifval($2, [[[input.y:21.10-68: warning: unused value: $]4[
148]]]))])
27622431 149
378f4bd8 150
ffa4ba3a
JD
151## --------------- ##
152## Unused values. ##
153## --------------- ##
154
155AT_SETUP([Unused values])
156AT_CHECK_UNUSED_VALUES
17bd8a73 157AT_CHECK_UNUSED_VALUES(, [1])
ffa4ba3a
JD
158AT_CLEANUP
159
160
161## ------------------------------------------ ##
162## Unused values before symbol declarations. ##
163## ------------------------------------------ ##
84866159 164
ffa4ba3a
JD
165AT_SETUP([Unused values before symbol declarations])
166AT_CHECK_UNUSED_VALUES([1])
17bd8a73 167AT_CHECK_UNUSED_VALUES([1], [1])
84866159 168AT_CLEANUP
378f4bd8
AD
169
170
ec5479ce
JD
171## --------------------------------------------- ##
172## Default %printer and %destructor redeclared. ##
173## --------------------------------------------- ##
174
175AT_SETUP([Default %printer and %destructor redeclared])
176
177AT_DATA([[input.y]],
12e35840
JD
178[[%destructor { destroy ($$); } <*> <*>
179%printer { destroy ($$); } <*> <*>
ec5479ce 180
12e35840
JD
181%destructor { destroy ($$); } <*>
182%printer { destroy ($$); } <*>
183
3ebecc24
JD
184%destructor { destroy ($$); } <> <>
185%printer { destroy ($$); } <> <>
12e35840 186
3ebecc24
JD
187%destructor { destroy ($$); } <>
188%printer { destroy ($$); } <>
ec5479ce
JD
189
190%%
191
192start: ;
193
12e35840
JD
194%destructor { destroy ($$); } <*>;
195%printer { destroy ($$); } <*>;
196
3ebecc24
JD
197%destructor { destroy ($$); } <>;
198%printer { destroy ($$); } <>;
ec5479ce
JD
199]])
200
da730230 201AT_BISON_CHECK([input.y], [1], [],
12e35840 202[[input.y:1.13-29: redeclaration for default tagged %destructor
b2a0b7ca 203input.y:1.13-29: previous declaration
12e35840 204input.y:2.10-26: redeclaration for default tagged %printer
b2a0b7ca 205input.y:2.10-26: previous declaration
12e35840 206input.y:4.13-29: redeclaration for default tagged %destructor
ec5479ce 207input.y:1.13-29: previous declaration
12e35840 208input.y:5.10-26: redeclaration for default tagged %printer
ec5479ce 209input.y:2.10-26: previous declaration
12e35840
JD
210input.y:7.13-29: redeclaration for default tagless %destructor
211input.y:7.13-29: previous declaration
212input.y:8.10-26: redeclaration for default tagless %printer
213input.y:8.10-26: previous declaration
214input.y:10.13-29: redeclaration for default tagless %destructor
215input.y:7.13-29: previous declaration
216input.y:11.10-26: redeclaration for default tagless %printer
217input.y:8.10-26: previous declaration
218input.y:17.13-29: redeclaration for default tagged %destructor
ec5479ce 219input.y:4.13-29: previous declaration
12e35840 220input.y:18.10-26: redeclaration for default tagged %printer
ec5479ce 221input.y:5.10-26: previous declaration
12e35840
JD
222input.y:20.13-29: redeclaration for default tagless %destructor
223input.y:10.13-29: previous declaration
224input.y:21.10-26: redeclaration for default tagless %printer
225input.y:11.10-26: previous declaration
ec5479ce
JD
226]])
227
228AT_CLEANUP
229
230
b2a0b7ca
JD
231## ---------------------------------------------- ##
232## Per-type %printer and %destructor redeclared. ##
233## ---------------------------------------------- ##
234
235AT_SETUP([Per-type %printer and %destructor redeclared])
236
237AT_DATA([[input.y]],
238[[%destructor { destroy ($$); } <field1> <field2>
239%printer { destroy ($$); } <field1> <field2>
240
241%destructor { destroy ($$); } <field1> <field1>
242%printer { destroy ($$); } <field2> <field2>
243
244%%
245
246start: ;
247
248%destructor { destroy ($$); } <field2> <field1>;
249%printer { destroy ($$); } <field2> <field1>;
250]])
251
da730230 252AT_BISON_CHECK([input.y], [1], [],
b2a0b7ca
JD
253[[input.y:4.13-29: %destructor redeclaration for <field1>
254input.y:1.13-29: previous declaration
255input.y:4.13-29: %destructor redeclaration for <field1>
256input.y:4.13-29: previous declaration
257input.y:5.10-26: %printer redeclaration for <field2>
258input.y:2.10-26: previous declaration
259input.y:5.10-26: %printer redeclaration for <field2>
260input.y:5.10-26: previous declaration
261input.y:11.13-29: %destructor redeclaration for <field1>
262input.y:4.13-29: previous declaration
263input.y:11.13-29: %destructor redeclaration for <field2>
264input.y:1.13-29: previous declaration
265input.y:12.10-26: %printer redeclaration for <field1>
266input.y:2.10-26: previous declaration
267input.y:12.10-26: %printer redeclaration for <field2>
268input.y:5.10-26: previous declaration
269]])
270
271AT_CLEANUP
272
273
ec5479ce
JD
274## ---------------------------------------- ##
275## Unused values with default %destructor. ##
276## ---------------------------------------- ##
277
278AT_SETUP([Unused values with default %destructor])
279
280AT_DATA([[input.y]],
3ebecc24 281[[%destructor { destroy ($$); } <>
12e35840
JD
282%type <tag> tagged
283
284%%
285
286start: end end tagged tagged { $<tag>1; $3; } ;
287end: { } ;
288tagged: { } ;
289]])
290
da730230 291AT_BISON_CHECK([input.y], [0], [],
12e35840
JD
292[[input.y:6.8-45: warning: unset value: $$
293input.y:6.8-45: warning: unused value: $2
294input.y:7.6-8: warning: unset value: $$
295]])
296
297AT_DATA([[input.y]],
298[[%destructor { destroy ($$); } <*>
299%type <tag> tagged
ec5479ce
JD
300
301%%
302
12e35840
JD
303start: end end tagged tagged { $<tag>1; $3; } ;
304end: { } ;
305tagged: { } ;
ec5479ce
JD
306]])
307
da730230 308AT_BISON_CHECK([input.y], [0], [],
12e35840
JD
309[[input.y:6.8-45: warning: unused value: $4
310input.y:8.9-11: warning: unset value: $$
ec5479ce
JD
311]])
312
313AT_CLEANUP
314
315
b2a0b7ca
JD
316## ----------------------------------------- ##
317## Unused values with per-type %destructor. ##
318## ----------------------------------------- ##
319
320AT_SETUP([Unused values with per-type %destructor])
321
322AT_DATA([[input.y]],
323[[%destructor { destroy ($$); } <field1>
324%type <field1> start end
325
326%%
327
328start: end end { $1; } ;
329end: { } ;
330]])
331
da730230 332AT_BISON_CHECK([input.y], [0], [],
b2a0b7ca
JD
333[[input.y:6.8-22: warning: unset value: $$
334input.y:6.8-22: warning: unused value: $2
335input.y:7.6-8: warning: unset value: $$
336]])
337
338AT_CLEANUP
339
340
df09ef2e
AD
341## ---------------------- ##
342## Incompatible Aliases. ##
343## ---------------------- ##
344
345AT_SETUP([Incompatible Aliases])
346
347AT_DATA([input.y],
348[[%token foo "foo"
349
350%type <bar> foo
351%printer {bar} foo
352%destructor {bar} foo
353%left foo
354
355%type <baz> "foo"
356%printer {baz} "foo"
357%destructor {baz} "foo"
358%left "foo"
359
360%%
361exp: foo;
362]])
363
da730230 364AT_BISON_CHECK([input.y], [1], [],
df09ef2e 365[[input.y:8.7-11: %type redeclaration for foo
dd60572a 366input.y:3.7-11: previous declaration
df09ef2e 367input.y:10.13-17: %destructor redeclaration for foo
dd60572a 368input.y:5.13-17: previous declaration
e2a8c0f5 369input.y:9.10-14: %printer redeclaration for foo
dd60572a 370input.y:4.10-14: previous declaration
df09ef2e 371input.y:11.1-5: %left redeclaration for foo
dd60572a 372input.y:6.1-5: previous declaration
df09ef2e
AD
373]])
374
375AT_CLEANUP
376
377
5a08f1ce
AD
378
379## ----------------------- ##
380## Torturing the Scanner. ##
381## ----------------------- ##
382
383# Be sure to compile and run, so that the C compiler checks what
384# we do.
385
386AT_SETUP([Torturing the Scanner])
387
0baf7c50
PE
388
389AT_DATA([input.y], [])
da730230 390AT_BISON_CHECK([input.y], [1], [],
4a678af8 391[[input.y:1.1: syntax error, unexpected end of file
0baf7c50
PE
392]])
393
394
e9071366 395AT_DATA([input.y],
b2ddc3f3
AD
396[{}
397])
da730230 398AT_BISON_CHECK([input.y], [1], [],
4a678af8 399[[input.y:1.1-2: syntax error, unexpected {...}
b2ddc3f3
AD
400]])
401
402
9501dc6e 403AT_DATA_GRAMMAR([input.y],
5a08f1ce
AD
404[[%{
405/* This is seen in GCC: a %{ and %} in middle of a comment. */
406const char *foo = "So %{ and %} can be here too.";
407
dda7a53e
PE
408#if 0
409/* These examples test Bison while not stressing C compilers too much.
410 Many C compilers mishandle backslash-newlines, so this part of the
411 test is inside "#if 0". The comment and string are written so that
412 the "#endif" will be seen regardless of the C compiler bugs that we
413 know about, namely:
414
415 HP C (as of late 2002) mishandles *\[newline]\[newline]/ within a
416 comment.
417
418 The Apple Darwin compiler (as of late 2002) mishandles
419 \\[newline]' within a character constant.
420
421 */
422
206fe6a5 423/\
dda7a53e
PE
424* A comment with backslash-newlines in it. %} *\
425\
206fe6a5 426/
dda7a53e 427/* { Close the above comment, if the C compiler mishandled it. */
206fe6a5
PE
428
429char str[] = "\\
430" A string with backslash-newlines in it %{ %} \\
dda7a53e 431\
206fe6a5
PE
432"";
433
dda7a53e 434char apostrophe = '\'';
206fe6a5
PE
435#endif
436
5a08f1ce 437#include <stdio.h>
c4bd5bf7 438#include <stdlib.h>
5a08f1ce
AD
439%}
440/* %{ and %} can be here too. */
441
442%{
443/* Exercise pre-prologue dependency to %union. */
051ade83 444typedef int value;
5a08f1ce
AD
445%}
446
447/* Exercise M4 quoting: '@:>@@:>@', 0. */
448
449/* Also exercise %union. */
450%union
451{
051ade83 452 value ival; /* A comment to exercise an old bug. */
5a08f1ce
AD
453};
454
455
456/* Exercise post-prologue dependency to %union. */
457%{
051ade83 458static YYSTYPE value_as_yystype (value val);
5a08f1ce
AD
459
460/* Exercise quotes in declarations. */
461char quote[] = "@:>@@:>@,";
462%}
463
464%{
465static void yyerror (const char *s);
7172e23e 466static int yylex (void);
5a08f1ce
AD
467%}
468
206fe6a5 469%type <ival> '@<:@'
5a08f1ce
AD
470
471/* Exercise quotes in strings. */
3dc4c5fa 472%token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/??<??=??> \x1\1"
5a08f1ce
AD
473
474%%
206fe6a5 475/* Exercise M4 quoting: '@:>@@:>@', @<:@, 1. */
087b9fdf 476exp: '@<:@' '\1' two '$' '@' '{' oline output.or.oline.opt
5a08f1ce
AD
477 {
478 /* Exercise quotes in braces. */
479 char tmp[] = "@<:@%c@:>@,\n";
480 printf (tmp, $1);
481 }
482;
5b7f88c7
PE
483
484two: '\x000000000000000000000000000000000000000000000000000000000000000000002';
485oline: '@' 'o' 'l' 'i' 'n' 'e' '@' '_' '_' 'o' 'l' 'i' 'n' 'e' '_' '_';
087b9fdf 486output.or.oline.opt: ;|oline;;|output;;;
5b7f88c7 487output: '#' 'o' 'u' 't' 'p' 'u' 't' ' ';
5a08f1ce 488%%
206fe6a5 489/* Exercise M4 quoting: '@:>@@:>@', @<:@, 2. */
5a08f1ce
AD
490
491static YYSTYPE
051ade83 492value_as_yystype (value val)
5a08f1ce
AD
493{
494 YYSTYPE res;
495 res.ival = val;
496 return res;
497}
498
7172e23e 499static int
5a08f1ce
AD
500yylex (void)
501{
cf806753 502 static char const input[] = "@<:@\1\2$@{@oline@__@&t@oline__\
5b7f88c7
PE
503#output "; /* "
504 */
cf806753
PE
505 static size_t toknum;
506 if (! (toknum < sizeof input))
507 abort ();
508 yylval = value_as_yystype (input[toknum]);
509 return input[toknum++];
5a08f1ce
AD
510}
511
512static void
513yyerror (const char *msg)
514{
515 fprintf (stderr, "%s\n", msg);
516}
517]])
518
9501dc6e
AD
519# Pacify Emacs'font-lock-mode: "
520
5a08f1ce 521AT_DATA([main.c],
051ade83 522[[typedef int value;
5a08f1ce
AD
523#include "input.h"
524
525int yyparse (void);
526
527int
528main (void)
529{
530 return yyparse ();
531}
532]])
533
da730230 534AT_BISON_CHECK([-d -v -o input.c input.y])
efc6bf1b
PE
535AT_COMPILE([input.o], [-c input.c])
536AT_COMPILE([main.o], [-c main.c])
537AT_COMPILE([input], [input.o main.o])
1154cced 538AT_PARSER_CHECK([./input], 0,
206fe6a5 539[[[@<:@],
5a08f1ce
AD
540]])
541
542AT_CLEANUP
e59adf8f
PE
543
544
545## ---------------------- ##
546## Typed symbol aliases. ##
547## ---------------------- ##
548
549AT_SETUP([Typed symbol aliases])
550
551# Bison 2.0 broke typed symbol aliases - ensure they work.
552
553AT_DATA_GRAMMAR([input.y],
554[[%union
555{
556 int val;
557};
558%token <val> MY_TOKEN "MY TOKEN"
559%type <val> exp
560%%
561exp: "MY TOKEN";
562%%
563]])
564
da730230 565AT_BISON_CHECK([-o input.c input.y])
e59adf8f
PE
566
567AT_CLEANUP
b50d2359
AD
568
569
570## --------- ##
571## Require. ##
572## --------- ##
573
574m4_define([AT_CHECK_REQUIRE],
575[AT_SETUP([Require $1])
576AT_DATA_GRAMMAR([input.y],
577[[%require "$1";
578%%
579empty_file:;
580]])
da730230 581AT_BISON_CHECK([-o input.c input.y], $2, [], ignore)
b50d2359
AD
582AT_CLEANUP
583])
584
585AT_CHECK_REQUIRE(1.0, 0)
586AT_CHECK_REQUIRE(AT_PACKAGE_VERSION, 0)
587## FIXME: Some day augment this version number.
9b8a5ce0 588AT_CHECK_REQUIRE(100.0, 63)
1f6b3679
JD
589
590
591## ------------------------------------- ##
592## String aliases for character tokens. ##
593## ------------------------------------- ##
594
595AT_SETUP([String aliases for character tokens])
596
dab244d5
AD
597# Bison once thought a character token and its alias were different
598# symbols with the same user token number.
1f6b3679
JD
599
600AT_DATA_GRAMMAR([input.y],
601[[%token 'a' "a"
602%%
603start: 'a';
604%%
605]])
606
da730230 607AT_BISON_CHECK([-o input.c input.y])
1f6b3679
JD
608
609AT_CLEANUP
47aee066
JD
610
611
746ee38c
AD
612## -------------- ##
613## Symbol names. ##
614## -------------- ##
615
616AT_SETUP([Symbols])
617
746ee38c
AD
618AT_DATA_GRAMMAR([input.y],
619[[%token WITH-DASH
620%token WITHOUT_DASH "WITHOUT-DASH"
621%token WITH.PERIOD
622%token WITHOUT_PERIOD "WITHOUT.PERIOD"
d521ee19
JD
623%code {
624 void yyerror (char const *);
625 int yylex (void);
626}
746ee38c
AD
627%%
628start: with-dash without_dash with.period without_period;
629with-dash: WITH-DASH;
630without_dash: "WITHOUT-DASH";
631with.period: WITH.PERIOD;
632without_period: "WITHOUT.PERIOD";
633%%
634]])
635
636# POSIX Yacc accept periods, but not dashes.
637AT_BISON_CHECK([--yacc input.y], [1], [],
638[[input.y:9.8-16: POSIX Yacc forbids dashes in symbol names: WITH-DASH
d521ee19 639input.y:18.8-16: POSIX Yacc forbids dashes in symbol names: with-dash
746ee38c
AD
640]])
641
642# So warn about them.
643AT_BISON_CHECK([-Wyacc input.y], [], [],
644[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH
d521ee19 645input.y:18.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash
746ee38c
AD
646]])
647
648# Dashes are fine for GNU Bison.
649AT_BISON_CHECK([-o input.c input.y])
650
651# Make sure we don't export silly token identifiers with periods or dashes.
652AT_COMPILE([input.o], [-c input.c])
653
654
cdf3f113
AD
655# Periods and dashes are genuine letters, they can start identifiers.
656# Digits cannot.
746ee38c 657AT_DATA_GRAMMAR([input.y],
cdf3f113 658[[%token .GOOD
84a1cb5a
AD
659 -GOOD
660 1NV4L1D
746ee38c 661%%
cdf3f113 662start: .GOOD -GOOD
746ee38c
AD
663]])
664AT_BISON_CHECK([-o input.c input.y], [1], [],
84a1cb5a 665[[input.y:11.10-16: invalid identifier: `1NV4L1D'
746ee38c
AD
666]])
667
668AT_CLEANUP
669
670
ab2a9f57
AD
671## ----------------- ##
672## Numbered tokens. ##
673## ----------------- ##
674
675AT_SETUP([Numbered tokens])
676
83b60c97
JD
677AT_DATA_GRAMMAR([redecl.y],
678[[%token DECIMAL_1 11259375
679 HEXADECIMAL_1 0xabcdef
680 HEXADECIMAL_2 0xFEDCBA
681 DECIMAL_2 16702650
ab2a9f57 682%%
83b60c97 683start: DECIMAL_1 HEXADECIMAL_2;
8893145a
AD
684]])
685
83b60c97
JD
686AT_BISON_CHECK([redecl.y], [1], [],
687[[redecl.y:10.10-22: user token number 11259375 redeclaration for HEXADECIMAL_1
688redecl.y:9.8-16: previous declaration for DECIMAL_1
689redecl.y:12.10-18: user token number 16702650 redeclaration for DECIMAL_2
690redecl.y:11.10-22: previous declaration for HEXADECIMAL_2
8893145a
AD
691]])
692
83b60c97 693AT_DATA_GRAMMAR([too-large.y],
ab2a9f57
AD
694[[%token TOO_LARGE_DEC 999999999999999999999
695 TOO_LARGE_HEX 0xFFFFFFFFFFFFFFFFFFF
696%%
697start: TOO_LARGE_DEC TOO_LARGE_HEX
698%%
699]])
700
83b60c97
JD
701AT_BISON_CHECK([too-large.y], [1], [],
702[[too-large.y:9.22-42: integer out of range: `999999999999999999999'
703too-large.y:10.24-44: integer out of range: `0xFFFFFFFFFFFFFFFFFFF'
ab2a9f57
AD
704]])
705
706AT_CLEANUP
707
708
47aee066
JD
709## --------------------- ##
710## Unclosed constructs. ##
711## --------------------- ##
712
713AT_SETUP([Unclosed constructs])
714
dab244d5
AD
715# Bison's scan-gram.l once forgot to STRING_FINISH some unclosed
716# constructs, so they were prepended to whatever it STRING_GROW'ed
717# next. It also threw them away rather than returning them to the
718# parser. The effect was confusing subsequent error messages.
47aee066
JD
719
720AT_DATA([input.y],
721[[%token A "a
722%token B "b"
723%token AB "ab" // Used to complain that "ab" was already used.
724%token C '1
725%token TWO "2"
726%token TICK_TWELVE "'12" // Used to complain that "'12" was already used.
727
728%%
729
730start: ;
731
732// Used to report a syntax error because it didn't see any kind of symbol
733// identifier.
734%type <f> 'a
735;
736%type <f> "a
737;
738// Used to report a syntax error because it didn't see braced code.
739%destructor { free ($$)
740]])
741
da730230 742AT_BISON_CHECK([-o input.c input.y], 1, [],
47aee066
JD
743[[input.y:1.10-2.0: missing `"' at end of line
744input.y:4.10-5.0: missing `'' at end of line
745input.y:14.11-15.0: missing `'' at end of line
746input.y:16.11-17.0: missing `"' at end of line
747input.y:19.13-20.0: missing `}' at end of file
3be03b13 748input.y:20.1: syntax error, unexpected end of file
47aee066
JD
749]])
750
751AT_CLEANUP
4d7370cb
JD
752
753
754## ------------------------- ##
755## %start after first rule. ##
756## ------------------------- ##
757
758AT_SETUP([%start after first rule])
759
dab244d5
AD
760# Bison once complained that a %start after the first rule was a
761# redeclaration of the start symbol.
4d7370cb
JD
762
763AT_DATA([input.y],
764[[%%
765false_start: ;
766start: false_start ;
767%start start;
768]])
769
da730230 770AT_BISON_CHECK([-o input.c input.y])
4d7370cb
JD
771
772AT_CLEANUP
26b8a438
JD
773
774
775## --------------------- ##
776## %prec takes a token. ##
777## --------------------- ##
778
779AT_SETUP([%prec takes a token])
780
781# Bison once allowed %prec sym where sym was a nonterminal.
782
783AT_DATA([input.y],
784[[%%
785start: PREC %prec PREC ;
786PREC: ;
787]])
788
da730230 789AT_BISON_CHECK([input.y], [1], [],
26b8a438
JD
790[[input.y:3.1-4: rule given for PREC, which is a token
791]])
792
793AT_CLEANUP
8e0a5e9e
JD
794
795
8bb3a2e7
JD
796## ------------------------------- ##
797## %prec's token must be defined. ##
798## ------------------------------- ##
799
800AT_SETUP([[%prec's token must be defined]])
801
802# According to POSIX, a %prec token must be defined separately.
803
804AT_DATA([[input.y]],
805[[%%
806start: %prec PREC ;
807]])
808
02354690
JD
809AT_BISON_CHECK([[input.y]], [[0]], [],
810[[input.y:2.8-17: warning: token for %prec is not defined: PREC
8bb3a2e7
JD
811]])
812
813AT_CLEANUP
814
815
6afc30cc
JD
816## -------------------------------- ##
817## Reject unused %code qualifiers. ##
818## -------------------------------- ##
8e0a5e9e 819
6afc30cc 820AT_SETUP([Reject unused %code qualifiers])
8e0a5e9e
JD
821
822AT_DATA([input-c.y],
16dc6a9e
JD
823[[%code q {}
824%code bad {}
825%code bad {}
8405b70c 826%code format {}
8e0a5e9e
JD
827%%
828start: ;
829]])
c6abeab1
JD
830AT_BISON_CHECK([[input-c.y]], [[1]], [],
831[[input-c.y:1.7: %code qualifier `q' is not used
832input-c.y:2.7-9: %code qualifier `bad' is not used
833input-c.y:3.7-9: %code qualifier `bad' is not used
834input-c.y:4.7-12: %code qualifier `format' is not used
08af01c2 835]])
8e0a5e9e
JD
836
837AT_DATA([input-c-glr.y],
16dc6a9e
JD
838[[%code q {}
839%code bad {}
840 %code bad {}
8e0a5e9e
JD
841%%
842start: ;
843]])
c6abeab1
JD
844AT_BISON_CHECK([[input-c-glr.y]], [[1]], [],
845[[input-c-glr.y:1.7: %code qualifier `q' is not used
846input-c-glr.y:2.7-9: %code qualifier `bad' is not used
847input-c-glr.y:3.8-10: %code qualifier `bad' is not used
08af01c2 848]])
8e0a5e9e
JD
849
850AT_DATA([input-c++.y],
16dc6a9e
JD
851[[%code q {}
852%code bad {}
853 %code q {}
8e0a5e9e
JD
854%%
855start: ;
856]])
c6abeab1
JD
857AT_BISON_CHECK([[input-c++.y]], [[1]], [],
858[[input-c++.y:1.7: %code qualifier `q' is not used
859input-c++.y:2.7-9: %code qualifier `bad' is not used
860input-c++.y:3.8: %code qualifier `q' is not used
08af01c2 861]])
8e0a5e9e
JD
862
863AT_DATA([input-c++-glr.y],
16dc6a9e
JD
864[[%code bad {}
865%code q {}
866%code q {}
8e0a5e9e
JD
867%%
868start: ;
869]])
c6abeab1
JD
870AT_BISON_CHECK([[input-c++-glr.y]], [[1]], [],
871[[input-c++-glr.y:1.7-9: %code qualifier `bad' is not used
872input-c++-glr.y:2.7: %code qualifier `q' is not used
873input-c++-glr.y:3.7: %code qualifier `q' is not used
3fc65ead
JD
874]])
875
876AT_DATA([special-char-@@.y],
16dc6a9e
JD
877[[%code bad {}
878%code q {}
879%code q {}
3fc65ead
JD
880%%
881start: ;
882]])
c6abeab1
JD
883AT_BISON_CHECK([[special-char-@@.y]], [[1]], [],
884[[special-char-@@.y:1.7-9: %code qualifier `bad' is not used
885special-char-@@.y:2.7: %code qualifier `q' is not used
886special-char-@@.y:3.7: %code qualifier `q' is not used
3fc65ead
JD
887]])
888
889AT_DATA([special-char-@:>@.y],
16dc6a9e
JD
890[[%code bad {}
891%code q {}
892%code q {}
3fc65ead
JD
893%%
894start: ;
895]])
c6abeab1
JD
896AT_BISON_CHECK([[special-char-@:>@.y]], [[1]], [],
897[[special-char-@:>@.y:1.7-9: %code qualifier `bad' is not used
898special-char-@:>@.y:2.7: %code qualifier `q' is not used
899special-char-@:>@.y:3.7: %code qualifier `q' is not used
08af01c2 900]])
8e0a5e9e
JD
901
902AT_CLEANUP
7eb8a0bc
JD
903
904
905## ---------------- ##
906## %define errors. ##
907## ---------------- ##
908
909AT_SETUP([%define errors])
910
0b6d43c5 911AT_DATA([input-redefined.y],
16dc6a9e
JD
912[[%define var "value1"
913%define var "value1"
914 %define var "value2"
915%define special1 "@:>@"
916%define special2 "@<:@"
7eb8a0bc
JD
917%%
918start: ;
919]])
920
0b6d43c5
JD
921AT_BISON_CHECK([[input-redefined.y]], [[1]], [],
922[[input-redefined.y:2.9-11: %define variable `var' redefined
923input-redefined.y:1.9-11: previous definition
924input-redefined.y:3.10-12: %define variable `var' redefined
925input-redefined.y:2.9-11: previous definition
926]])
927
928AT_DATA([input-unused.y],
929[[%define var "value"
930%%
931start: ;
932]])
933
c6abeab1
JD
934AT_BISON_CHECK([[input-unused.y]], [[1]], [],
935[[input-unused.y:1.9-11: %define variable `var' is not used
7eb8a0bc
JD
936]])
937
938AT_CLEANUP
c1d19e10 939
58697c6d 940
de5ab940
JD
941## ----------------------------------- ##
942## %define, --define, --force-define. ##
943## ----------------------------------- ##
58697c6d 944
c6abeab1 945AT_SETUP([[%define, --define, --force-define]])
de5ab940 946
c6abeab1 947AT_DATA([[skel.c]],
de5ab940
JD
948[[m4@&t@_divert_push(0)@
949@output(b4_parser_file_name@)@
950[var-dd: ]b4_percent_define_get([[var-dd]])[
951var-ff: ]b4_percent_define_get([[var-ff]])[
de5ab940
JD
952var-dfg: ]b4_percent_define_get([[var-dfg]])[
953var-fd: ]b4_percent_define_get([[var-fd]])
954m4@&t@_divert_pop(0)
955]])
c6abeab1 956AT_DATA([[input.y]],
0b6d43c5 957[[%define var-dfg "gram"
58697c6d
AD
958%%
959start: ;
960]])
de5ab940
JD
961AT_BISON_CHECK([[-Dvar-dd=cmd-d1 -Dvar-dd=cmd-d2 \
962 -Fvar-ff=cmd-f1 -Fvar-ff=cmd-f2 \
de5ab940
JD
963 -Dvar-dfg=cmd-d -Fvar-dfg=cmd-f \
964 -Fvar-fd=cmd-f -Dvar-fd=cmd-d \
c6abeab1 965 --skeleton ./skel.c input.y]])
de5ab940
JD
966AT_CHECK([[cat input.tab.c]], [[0]],
967[[var-dd: cmd-d2
968var-ff: cmd-f2
de5ab940
JD
969var-dfg: cmd-f
970var-fd: cmd-d
58697c6d
AD
971]])
972
c6abeab1 973AT_DATA([[input-dg.y]],
0b6d43c5
JD
974[[%define var "gram"
975%%
976start: ;
977]])
0b6d43c5
JD
978AT_BISON_CHECK([[-Dvar=cmd-d input-dg.y]], [[1]], [],
979[[input-dg.y:1.9-11: %define variable `var' redefined
980<command line>:2: previous definition
981]])
982
c6abeab1
JD
983AT_DATA([[input-unused.y]],
984[[%%
985start: ;
986]])
987AT_BISON_CHECK([[-Dunused-d -Funused-f input-unused.y]], [[1]], [],
988[[<command line>:2: %define variable `unused-d' is not used
989<command line>:3: %define variable `unused-f' is not used
990]])
991
58697c6d
AD
992AT_CLEANUP
993
c1d19e10 994## --------------------------- ##
d782395d 995## %define Boolean variables. ##
c1d19e10
PB
996## --------------------------- ##
997
d782395d 998AT_SETUP([[%define Boolean variables]])
c1d19e10
PB
999
1000AT_DATA([Input.y],
1001[[%language "Java"
1002%define public "maybe"
1003%define parser_class_name "Input"
1004%%
1005start: ;
1006]])
1007
da730230 1008AT_BISON_CHECK([[Input.y]], [1], [],
922bdd7f 1009[[Input.y:2.9-14: invalid value for %define Boolean variable `public'
c1d19e10
PB
1010]])
1011
1012AT_CLEANUP
d782395d 1013
f4909773
JD
1014## ------------------------ ##
1015## %define enum variables. ##
1016## ------------------------ ##
7254f6a8 1017
f4909773 1018AT_SETUP([[%define enum variables]])
7254f6a8 1019
f4909773 1020# Front-end.
7254f6a8 1021AT_DATA([[input.y]],
cf499cff 1022[[%define lr.default-reductions bogus
7254f6a8
JD
1023%%
1024start: ;
1025]])
7254f6a8 1026AT_BISON_CHECK([[input.y]], [[1]], [[]],
5bab9d08 1027[[input.y:1.9-29: invalid value for %define variable `lr.default-reductions': `bogus'
f4909773
JD
1028input.y:1.9-29: accepted value: `all'
1029input.y:1.9-29: accepted value: `consistent'
1030input.y:1.9-29: accepted value: `accepting'
7254f6a8
JD
1031]])
1032
f4909773 1033# Back-end.
67212941 1034AT_DATA([[input.y]],
cf499cff 1035[[%define api.push-pull neither
67212941
JD
1036%%
1037start: ;
1038]])
1039AT_BISON_CHECK([[input.y]], [1], [],
1040[[input.y:1.9-21: invalid value for %define variable `api.push-pull': `neither'
1041input.y:1.9-21: accepted value: `pull'
1042input.y:1.9-21: accepted value: `push'
1043input.y:1.9-21: accepted value: `both'
1044]])
1045
1046AT_CLEANUP
1047
1048## -------------------------------- ##
1049## %define backward compatibility. ##
1050## -------------------------------- ##
1051
1052AT_SETUP([[%define backward compatibility]])
1053
1054# The error messages tell us whether underscores in these variables are
1055# being converted to dashes.
1056
d782395d 1057AT_DATA([[input.y]],
c373bf8b 1058[[%define api.push_pull "neither"
d782395d
JD
1059%%
1060start: ;
1061]])
da730230 1062AT_BISON_CHECK([[input.y]], [1], [],
67212941 1063[[input.y:1.9-21: invalid value for %define variable `api.push-pull': `neither'
f4909773
JD
1064input.y:1.9-21: accepted value: `pull'
1065input.y:1.9-21: accepted value: `push'
1066input.y:1.9-21: accepted value: `both'
d782395d
JD
1067]])
1068
67212941 1069AT_DATA([[input.y]],
cf499cff 1070[[%define lr.keep_unreachable_states maybe
67212941
JD
1071%%
1072start: ;
1073]])
1074AT_BISON_CHECK([[input.y]], [1], [],
1075[[input.y:1.9-34: invalid value for %define Boolean variable `lr.keep-unreachable-states'
1076]])
1077
171ad99d
AD
1078AT_DATA([[input.y]],
1079[[%define namespace "foo"
1080%define api.namespace "foo"
1081%%
1082start: ;
1083]])
1084AT_BISON_CHECK([[input.y]], [1], [],
1085[[input.y:2.9-21: %define variable `api.namespace' redefined
1086input.y:1.9-17: previous definition
1087]])
1088
67212941
JD
1089AT_DATA([[input.y]],
1090[[%define foo_bar "baz"
1091%%
1092start: ;
1093]])
c6abeab1
JD
1094AT_BISON_CHECK([[input.y]], [[1]], [],
1095[[input.y:1.9-15: %define variable `foo_bar' is not used
67212941
JD
1096]])
1097
d782395d 1098AT_CLEANUP
793fbca5 1099
d9df47b6
JD
1100## ------------------------- ##
1101## Unused %define api.pure. ##
1102## ------------------------- ##
1103
1104AT_SETUP([[Unused %define api.pure]])
1105
1106# AT_CHECK_API_PURE(DECLS, VALUE)
1107# -------------------------------
1108# Make sure Bison reports that `%define api.pure VALUE' is unused when DECLS
1109# are specified.
1110m4_define([AT_CHECK_API_PURE],
1111[
1112AT_DATA([[input.y]],
1113[[%define api.pure ]$2[
1114]$1[
1115%%
1116start: ;
1117]])
1118
c6abeab1
JD
1119AT_BISON_CHECK([[input.y]], [[1]], [],
1120[[input.y:1.9-16: %define variable `api.pure' is not used
d9df47b6
JD
1121]])
1122])
1123
1124AT_CHECK_API_PURE([[%language "c++" %defines]], [[]])
cf499cff 1125AT_CHECK_API_PURE([[%language "c++" %defines]], [[false]])
d9df47b6 1126AT_CHECK_API_PURE([[%language "c++" %defines %glr-parser]], [[""]])
cf499cff
JD
1127AT_CHECK_API_PURE([[%language "c++" %defines %glr-parser]], [[false]])
1128AT_CHECK_API_PURE([[%language "java"]], [[true]])
1129AT_CHECK_API_PURE([[%language "java"]], [[false]])
d9df47b6
JD
1130
1131AT_CLEANUP
1132
793fbca5
JD
1133## -------------------------------- ##
1134## C++ namespace reference errors. ##
1135## -------------------------------- ##
1136
1137AT_SETUP([[C++ namespace reference errors]])
1138
1139# AT_CHECK_NAMESPACE_ERROR(NAMESPACE-DECL, ERROR, [ERROR], ...)
1140# -------------------------------------------------------------
1141# Make sure Bison reports all ERROR's for %define namespace "NAMESPACE-DECL".
1142m4_define([AT_CHECK_NAMESPACE_ERROR],
1143[
1144AT_DATA([[input.y]],
1145[[%language "C++"
1146%defines
67501061 1147%define api.namespace "]$1["
793fbca5
JD
1148%%
1149start: ;
1150]])
1151
da730230 1152AT_BISON_CHECK([[input.y]], [1], [],
793fbca5 1153[m4_foreach([b4_arg], m4_dquote(m4_shift($@)),
67501061 1154[[input.y:3.9-21: ]b4_arg[
793fbca5
JD
1155]])])
1156])
1157
1158AT_CHECK_NAMESPACE_ERROR([[]],
1159 [[namespace reference is empty]])
1160AT_CHECK_NAMESPACE_ERROR([[ ]],
1161 [[namespace reference is empty]])
1162AT_CHECK_NAMESPACE_ERROR([[foo::::bar]],
1163 [[namespace reference has consecutive "::"]])
1164AT_CHECK_NAMESPACE_ERROR([[foo:: ::bar]],
1165 [[namespace reference has consecutive "::"]])
1166AT_CHECK_NAMESPACE_ERROR([[::::bar]],
1167 [[namespace reference has consecutive "::"]])
1168AT_CHECK_NAMESPACE_ERROR([[:: ::bar]],
1169 [[namespace reference has consecutive "::"]])
1170AT_CHECK_NAMESPACE_ERROR([[foo::bar:: ::]],
1171 [[namespace reference has consecutive "::"]],
1172 [[namespace reference has a trailing "::"]])
1173AT_CHECK_NAMESPACE_ERROR([[foo::bar::]],
1174 [[namespace reference has a trailing "::"]])
1175AT_CHECK_NAMESPACE_ERROR([[foo::bar:: ]],
1176 [[namespace reference has a trailing "::"]])
1177AT_CHECK_NAMESPACE_ERROR([[::]],
1178 [[namespace reference has a trailing "::"]])
1179
1180AT_CLEANUP
3208e3f4
JD
1181
1182## ------------------------ ##
1183## Bad character literals. ##
1184## ------------------------ ##
1185
1186# Bison used to accept character literals that were empty or contained
1187# too many characters.
1188
b70c7fb4
JD
1189# FIXME: AT_DATA or some variant of AT_DATA may eventually permit
1190# the final newline to be omitted. See the threads starting at
3208e3f4
JD
1191# <http://lists.gnu.org/archive/html/bison-patches/2009-07/msg00019.html>.
1192
1193AT_SETUP([[Bad character literals]])
1194
1195AT_DATA([empty.y],
1196[[%%
1197start: '';
1198start: '
1199]])
b70c7fb4 1200AT_CHECK([[perl -e "print 'start: \'';" >> empty.y || exit 77]])
3208e3f4
JD
1201
1202AT_BISON_CHECK([empty.y], [1], [],
1203[[empty.y:2.8-9: warning: empty character literal
1204empty.y:3.8-4.0: warning: empty character literal
1205empty.y:3.8-4.0: missing `'' at end of line
1206empty.y:4.8: warning: empty character literal
1207empty.y:4.8: missing `'' at end of file
1208]])
1209
1210AT_DATA([two.y],
1211[[%%
1212start: 'ab';
1213start: 'ab
1214]])
b70c7fb4 1215AT_CHECK([[perl -e "print 'start: \'ab';" >> two.y || exit 77]])
3208e3f4
JD
1216
1217AT_BISON_CHECK([two.y], [1], [],
1218[[two.y:2.8-11: warning: extra characters in character literal
1219two.y:3.8-4.0: warning: extra characters in character literal
1220two.y:3.8-4.0: missing `'' at end of line
1221two.y:4.8-10: warning: extra characters in character literal
1222two.y:4.8-10: missing `'' at end of file
1223]])
1224
1225AT_DATA([three.y],
1226[[%%
1227start: 'abc';
1228start: 'abc
1229]])
b70c7fb4 1230AT_CHECK([[perl -e "print 'start: \'abc';" >> three.y || exit 77]])
3208e3f4
JD
1231
1232AT_BISON_CHECK([three.y], [1], [],
1233[[three.y:2.8-12: warning: extra characters in character literal
1234three.y:3.8-4.0: warning: extra characters in character literal
1235three.y:3.8-4.0: missing `'' at end of line
1236three.y:4.8-11: warning: extra characters in character literal
1237three.y:4.8-11: missing `'' at end of file
1238]])
1239
1240AT_CLEANUP
c2724603
JD
1241
1242## ------------------------- ##
1243## Bad escapes in literals. ##
1244## ------------------------- ##
1245
1246AT_SETUP([[Bad escapes in literals]])
1247
1248AT_DATA([input.y],
1249[[%%
1250start: '\777' '\0' '\xfff' '\x0'
1251 '\uffff' '\u0000' '\Uffffffff' '\U00000000'
1252 '\ ' '\A';
1253]])
3bed3a75 1254
b70c7fb4 1255# It is not easy to create special characters, we cannot even trust tr.
3bed3a75
AD
1256# Beside we cannot even expect "echo '\0'" to output two characters
1257# (well three with \n): at least Bash 3.2 converts the two-character
1258# sequence "\0" into a single NUL character.
b70c7fb4
JD
1259AT_CHECK([[perl -e 'print "start: \"\\\t\\\f\\\0\\\1\" ;";' >> input.y \
1260 || exit 77]])
c2724603
JD
1261
1262AT_BISON_CHECK([input.y], [1], [],
1263[[input.y:2.9-12: invalid number after \-escape: 777
1264input.y:2.8-13: warning: empty character literal
1265input.y:2.16-17: invalid number after \-escape: 0
1266input.y:2.15-18: warning: empty character literal
1267input.y:2.21-25: invalid number after \-escape: xfff
1268input.y:2.20-26: warning: empty character literal
1269input.y:2.29-31: invalid number after \-escape: x0
1270input.y:2.28-32: warning: empty character literal
1271input.y:3.9-14: invalid number after \-escape: uffff
1272input.y:3.8-15: warning: empty character literal
1273input.y:3.18-23: invalid number after \-escape: u0000
1274input.y:3.17-24: warning: empty character literal
1275input.y:3.27-36: invalid number after \-escape: Uffffffff
1276input.y:3.26-37: warning: empty character literal
1277input.y:3.40-49: invalid number after \-escape: U00000000
1278input.y:3.39-50: warning: empty character literal
1279input.y:4.9-10: invalid character after \-escape: ` '
1280input.y:4.8-11: warning: empty character literal
1281input.y:4.14-15: invalid character after \-escape: A
1282input.y:4.13-16: warning: empty character literal
1283input.y:5.9-16: invalid character after \-escape: \t
1284input.y:5.17: invalid character after \-escape: \f
1285input.y:5.18: invalid character after \-escape: \0
1286input.y:5.19: invalid character after \-escape: \001
1287]])
1288
1289AT_CLEANUP