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