From: Akim Demaille Date: Fri, 9 Jan 2015 11:01:22 +0000 (+0100) Subject: c++: fix the use of destructors when variants are enabled X-Git-Tag: v3.0.3~6 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/ee028dceff390a23da391900b5b7fe651cfe320c c++: fix the use of destructors when variants are enabled When using variants, destructors generate invalid code. Reported by Michael Catanzaro. * data/c++.m4 (~basic_symbol): b4_symbol_foreach works on yysym: define it. * tests/c++.at (Variants): Check it. --- diff --git a/NEWS b/NEWS index 490e89ed..18771946 100644 --- a/NEWS +++ b/NEWS @@ -4,19 +4,23 @@ GNU Bison NEWS ** Bug fixes -*** Named %union support +*** C++ with Variants (lalr1.cc) + + Problems with %destructor and '%define parse.assert' have been fixed. + +*** Named %union support (yacc.c, glr.c) Bison 3.0 introduced a regression on named %union such as %union foo { int ival; }; - The possibility to use a name was introduced ``for Yacc compatibility''. + The possibility to use a name was introduced "for Yacc compatibility". It is however not required by POSIX Yacc, and its usefulness is not clear. -*** %define api.value.type union with %defines +*** %define api.value.type union with %defines (yacc.c, glr.c) - The yacc.c and glr.c parsers were broken when %defines was used - together with "%define api.value.type union". + The C parsers were broken when %defines was used together with "%define + api.value.type union". *** Redeclarations are reported in proper order diff --git a/THANKS b/THANKS index 98ec269d..d5feb16e 100644 --- a/THANKS +++ b/THANKS @@ -83,6 +83,7 @@ Martin Mokrejs mmokrejs@natur.cuni.cz Martin Nylin martin.nylin@linuxmail.org Matt Kraai kraai@alumni.cmu.edu Matt Rosing rosing@peakfive.com +Michael Catanzaro mcatanzaro@gnome.org Michael Felt mamfelt@gmail.com Michael Hayes m.hayes@elec.canterbury.ac.nz Michael Raskin 7c6f434c@mail.ru diff --git a/data/c++.m4 b/data/c++.m4 index 8494d214..4321c305 100644 --- a/data/c++.m4 +++ b/data/c++.m4 @@ -346,6 +346,7 @@ m4_define([b4_public_types_define], {]b4_variant_if([[ // User destructor. symbol_number_type yytype = this->type_get (); + basic_symbol& yysym = *this; switch (yytype) { ]b4_symbol_foreach([b4_symbol_destructor])dnl diff --git a/tests/c++.at b/tests/c++.at index e6d69831..737037d3 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -252,10 +252,12 @@ typedef std::list 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> list result; +%type <::std::list> list; %printer { yyo << $$; } <::std::string> <::std::list>; +%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"); }