]> git.saurik.com Git - bison.git/blame_incremental - tests/synclines.at
tests: don't depend on the actual location type.
[bison.git] / tests / synclines.at
... / ...
CommitLineData
1# Executing Actions. -*- Autotest -*-
2# Copyright (C) 2002, 2004-2005, 2007, 2009-2010 Free Software
3# Foundation, Inc.
4
5# This program is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18AT_BANNER([[User Actions.]])
19
20
21# AT_SYNCLINES_COMPILE(FILE)
22# --------------------------
23# Compile FILE expecting an error, and save in the file stdout the
24# normalized output. Ignore the exit status, since some compilers
25# (e.g. c89 on IRIX 6.5) triger warnings on `#error', instead of
26# errors.
27m4_define([AT_SYNCLINES_COMPILE],
28[AT_CHECK([$CC $CFLAGS $CPPFLAGS -c $1], [ignore], [], [stderr])
29# In case GCC displays column information, strip it down.
30#
31# input.y:4:2: #error "4" or
32# input.y:4.2: #error "4" or
33# input.y:4:2: error: #error "4"
34# =>
35# input.y:4: #error "4"
36#
37AT_CHECK([[sed -e 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' -e 's/^\([^:]*:[^:]*:\)[^@%:@]*\( @%:@error\)/\1\2/' stderr]], 0, [stdout])
38])
39
40# AT_TEST_SYNCLINE(TITLE, INPUT, ERROR-MSG)
41# -----------------------------------------
42# Check that compiling the parser produced from INPUT cause GCC
43# to issue ERROR-MSG.
44m4_define([AT_TEST_SYNCLINE],
45[AT_SETUP([$1])
46
47# It seems impossible to find a generic scheme to check the location
48# of an error. Even requiring GCC is not sufficient, since for instance
49# the version modified by Apple:
50#
51# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs
52# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2
53# | 19991024 (release) configure:2124: $? = 0
54#
55# instead of:
56#
57# | input.y:2: #error "2"
58#
59# it reports:
60#
61# | input.y:2: "2"
62# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode
63
64AT_DATA([syncline.c],
65[[#error "1"
66]])
67
68AT_SYNCLINES_COMPILE([syncline.c])
69AT_CHECK([[test "`cat stdout`" = 'syncline.c:1: @%:@error "1"' || exit 77]])
70
71AT_DATA([[input.y]], [$2])
72AT_BISON_CHECK([-o input.c input.y])
73AT_SYNCLINES_COMPILE([input.c])
74# GCC 4.5 tells you the function within which #error appears, but
75# previous versions of gcc do not.
76AT_CHECK([grep -v ': In function ' stdout], 0, [$3])
77AT_CLEANUP
78])
79
80
81## --------------------- ##
82## Prologue synch line. ##
83## --------------------- ##
84
85
86AT_TEST_SYNCLINE([Prologue synch line],
87[[%{
88#error "2"
89void yyerror (const char *s);
90int yylex (void);
91%}
92%%
93exp: '0';
94]],
95[input.y:2: #error "2"
96])
97
98
99## ------------------- ##
100## %union synch line. ##
101## ------------------- ##
102
103AT_TEST_SYNCLINE([%union synch line],
104[[%union {
105#error "2"
106 char dummy;
107}
108%{
109void yyerror (const char *s);
110int yylex (void);
111%}
112%%
113exp: '0';
114]],
115[input.y:2: #error "2"
116])
117
118
119## ------------------------- ##
120## Postprologue synch line. ##
121## ------------------------- ##
122
123AT_TEST_SYNCLINE([Postprologue synch line],
124[[%{
125void yyerror (const char *s);
126int yylex (void);
127%}
128%union
129{
130 int ival;
131}
132%{
133#error "10"
134%}
135%%
136exp: '0';
137]],
138[input.y:10: #error "10"
139])
140
141
142## ------------------- ##
143## Action synch line. ##
144## ------------------- ##
145
146AT_TEST_SYNCLINE([Action synch line],
147[[%{
148void yyerror (const char *s);
149int yylex (void);
150%}
151%%
152exp:
153{
154#error "8"
155};
156]],
157[input.y:8: #error "8"
158])
159
160
161## --------------------- ##
162## Epilogue synch line. ##
163## --------------------- ##
164
165AT_TEST_SYNCLINE([Epilogue synch line],
166[[%{
167void yyerror (const char *s);
168int yylex (void);
169%}
170%%
171exp: '0';
172%%
173#error "8"
174]],
175[input.y:8: #error "8"
176])