mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
c++: fix the use of destructors when variants are enabled
When using variants, destructors generate invalid code. <http://lists.gnu.org/archive/html/bug-bison/2014-09/msg00005.html> Reported by Michael Catanzaro. * data/c++.m4 (~basic_symbol): b4_symbol_foreach works on yysym: define it. * tests/c++.at (Variants): Check it.
This commit is contained in:
35
tests/c++.at
35
tests/c++.at
@@ -252,10 +252,12 @@ typedef std::list<std::string> strings_type;
|
||||
// Using the template type to exercize its parsing.
|
||||
// Starting with :: to ensure we don't output "<::" which starts by the
|
||||
// digraph for the left square bracket.
|
||||
%type <::std::list<std::string>> list result;
|
||||
%type <::std::list<std::string>> list;
|
||||
|
||||
%printer { yyo << $$; }
|
||||
<int> <::std::string> <::std::list<std::string>>;
|
||||
%destructor { std::cerr << "Destroy: " << $$ << '\n'; } <*>;
|
||||
%destructor { std::cerr << "Destroy: \"" << $$ << "\"\n"; } <::std::string>;
|
||||
%%
|
||||
|
||||
result:
|
||||
@@ -336,8 +338,31 @@ namespace yy
|
||||
|
||||
AT_FULL_COMPILE([list])
|
||||
AT_PARSER_CHECK([./list], 0,
|
||||
[(0, 1, 2, 4, 6)
|
||||
])
|
||||
[[(0, 1, 2, 4, 6)
|
||||
]],
|
||||
[[Destroy: ""
|
||||
Destroy: "0"
|
||||
Destroy: (0)
|
||||
Destroy: 1
|
||||
Destroy: "1"
|
||||
Destroy: ()
|
||||
Destroy: ""
|
||||
Destroy: "2"
|
||||
Destroy: ()
|
||||
Destroy: ""
|
||||
Destroy: 3
|
||||
Destroy: ()
|
||||
Destroy: ""
|
||||
Destroy: "4"
|
||||
Destroy: ()
|
||||
Destroy: ()
|
||||
Destroy: 5
|
||||
Destroy: ()
|
||||
Destroy: ""
|
||||
Destroy: "6"
|
||||
Destroy: ()
|
||||
Destroy: (0, 1, 2, 4, 6)
|
||||
]])
|
||||
|
||||
AT_BISON_OPTION_POPDEFS
|
||||
AT_CLEANUP
|
||||
@@ -826,10 +851,10 @@ list:
|
||||
|
||||
item:
|
||||
'a' { $$ = $][1; }
|
||||
| 'e' { YYUSE ($$); YYUSE($][1); error ("syntax error"); }
|
||||
| 'e' { YYUSE ($$); YYUSE ($][1); error ("syntax error"); }
|
||||
// Not just 'E', otherwise we reduce when 'E' is the lookahead, and
|
||||
// then the stack is emptied, defeating the point of the test.
|
||||
| 'E' 'a' { YYUSE($][1); $$ = $][2; }
|
||||
| 'E' 'a' { YYUSE ($][1); $$ = $][2; }
|
||||
| 'R' { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYERROR; }
|
||||
| 'p' { $$ = $][1; }
|
||||
| 's' { $$ = $][1; throw std::runtime_error ("reduction"); }
|
||||
|
||||
Reference in New Issue
Block a user