+
+# Syntax errors caught by the parser
+# ----------------------------------
+# Exercise the discarding of stack top and input until `error'
+# can be reduced.
+#
+# '(', 'x', 'x', 'x', 'x', 'x', ')',
+#
+# Load the stack and provoke an error that cannot be caught by the
+# grammar, to check that the stack is cleared. And make sure the
+# lookahead is freed.
+#
+# '(', 'x', ')',
+# '(', 'x', ')',
+# 'y'
+AT_PARSER_CHECK([./input '(xxxxx)(x)(x)y'], 1,
+[[sending: '(' (0@0-9)
+sending: 'x' (1@10-19)
+thing (1@10-19): 'x' (1@10-19)
+sending: 'x' (2@20-29)
+thing (2@20-29): 'x' (2@20-29)
+sending: 'x' (3@30-39)
+30-39: syntax error, unexpected 'x', expecting ')'
+Freeing nterm thing (2@20-29)
+Freeing nterm thing (1@10-19)
+Freeing token 'x' (3@30-39)
+sending: 'x' (4@40-49)
+Freeing token 'x' (4@40-49)
+sending: 'x' (5@50-59)
+Freeing token 'x' (5@50-59)
+sending: ')' (6@60-69)
+line (-1@0-69): '(' (0@0-9) error (@10-59) ')' (6@60-69)
+sending: '(' (7@70-79)
+sending: 'x' (8@80-89)
+thing (8@80-89): 'x' (8@80-89)
+sending: ')' (9@90-99)
+line (7@70-99): '(' (7@70-79) thing (8@80-89) ')' (9@90-99)
+sending: '(' (10@100-109)
+sending: 'x' (11@110-119)
+thing (11@110-119): 'x' (11@110-119)
+sending: ')' (12@120-129)
+line (10@100-129): '(' (10@100-109) thing (11@110-119) ')' (12@120-129)
+sending: 'y' (13@130-139)
+input (0@129-129): /* Nothing */
+input (2@100-129): line (10@100-129) input (0@129-129)
+input (2@70-129): line (7@70-99) input (2@100-129)
+input (2@0-129): line (-1@0-69) input (2@70-129)
+130-139: syntax error, unexpected 'y', expecting $end
+Freeing nterm input (2@0-129)
+Freeing token 'y' (13@130-139)
+Parsing FAILED.
+]])
+
+# Check destruction upon stack overflow
+# -------------------------------------
+# Upon stack overflow, all symbols on the stack should be destroyed.
+# Only check for yacc.c.
+AT_YACC_IF([
+AT_PARSER_CHECK([./input '(x)(x)(x)(x)(x)(x)(x)'], 2,
+[[sending: '(' (0@0-9)
+sending: 'x' (1@10-19)
+thing (1@10-19): 'x' (1@10-19)
+sending: ')' (2@20-29)
+line (0@0-29): '(' (0@0-9) thing (1@10-19) ')' (2@20-29)
+sending: '(' (3@30-39)
+sending: 'x' (4@40-49)
+thing (4@40-49): 'x' (4@40-49)
+sending: ')' (5@50-59)
+line (3@30-59): '(' (3@30-39) thing (4@40-49) ')' (5@50-59)
+sending: '(' (6@60-69)
+sending: 'x' (7@70-79)
+thing (7@70-79): 'x' (7@70-79)
+sending: ')' (8@80-89)
+line (6@60-89): '(' (6@60-69) thing (7@70-79) ')' (8@80-89)
+sending: '(' (9@90-99)
+sending: 'x' (10@100-109)
+thing (10@100-109): 'x' (10@100-109)
+sending: ')' (11@110-119)
+line (9@90-119): '(' (9@90-99) thing (10@100-109) ')' (11@110-119)
+sending: '(' (12@120-129)
+sending: 'x' (13@130-139)
+thing (13@130-139): 'x' (13@130-139)
+sending: ')' (14@140-149)
+line (12@120-149): '(' (12@120-129) thing (13@130-139) ')' (14@140-149)
+sending: '(' (15@150-159)
+sending: 'x' (16@160-169)
+thing (16@160-169): 'x' (16@160-169)
+sending: ')' (17@170-179)
+line (15@150-179): '(' (15@150-159) thing (16@160-169) ')' (17@170-179)
+sending: '(' (18@180-189)
+sending: 'x' (19@190-199)
+thing (19@190-199): 'x' (19@190-199)
+sending: ')' (20@200-209)
+200-209: memory exhausted
+Freeing nterm thing (19@190-199)
+Freeing nterm line (15@150-179)
+Freeing nterm line (12@120-149)
+Freeing nterm line (9@90-119)
+Freeing nterm line (6@60-89)
+Freeing nterm line (3@30-59)
+Freeing nterm line (0@0-29)
+Parsing FAILED (status 2).
+]])
+])
+
+])
+
+
+# AT_CHECK_PRINTER_AND_DESTRUCTOR([BISON-OPTIONS], [UNION-FLAG], [SKIP_FLAG])
+# ---------------------------------------------------------------------------
+m4_define([AT_CHECK_PRINTER_AND_DESTRUCTOR],
+[AT_SETUP([Printers and Destructors $2: $1])
+
+$3
+_AT_CHECK_PRINTER_AND_DESTRUCTOR($[1], $[2], $[3], $[4],
+[%error-verbose
+%debug
+%verbose
+%locations
+$1], [$2])
+