Was part of 3.2.4.
commit cafa811a661e166c54fb4b34b1d6bf8451cc8748 Author: Akim Demaille <[email protected]> Date: Mon Dec 24 08:19:01 2018 +0100 c++: also provide a copy constructor for symbol_type Suggested by Wolfgang Thaller. http://lists.gnu.org/archive/html/bug-bison/2018-12/msg00081.html * data/c++.m4 (basic_symbol, by_type): Instead of provide either move or copy constructor, always provide the copy one. * tests/c++.at (C++ Variant-based Symbols Unit Tests): Check it. diff --git a/NEWS b/NEWS index addda39c..4c6ea056 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,11 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + + Fix the move constructor of symbol_type. + + Always provide a copy constructor for symbol_type, even in modern C++. * Noteworthy changes in release 3.2.3 (2018-12-18) [stable] diff --git a/data/c++.m4 b/data/c++.m4 index 47e85930..9783293b 100644 --- a/data/c++.m4 +++ b/data/c++.m4 @@ -244,8 +244,13 @@ m4_define([b4_symbol_type_declare], /// Default constructor. basic_symbol (); - /// Move or copy constructor. - basic_symbol (YY_RVREF (basic_symbol) that); +#if 201103L <= YY_CPLUSPLUS + /// Move constructor. + basic_symbol (basic_symbol&& that); +#endif + + /// Copy constructor. + basic_symbol (const basic_symbol& that); ]b4_variant_if([[ /// Constructor for valueless symbols, and symbols from each type. @@ -290,8 +295,13 @@ m4_define([b4_symbol_type_declare], /// Default constructor. by_type (); - /// Move or copy constructor. - by_type (YY_RVREF (by_type) that); +#if 201103L <= YY_CPLUSPLUS + /// Move constructor. + by_type (by_type&& that); +#endif + + /// Copy constructor. + by_type (const by_type& that); /// The symbol type as needed by the constructor. typedef token_type kind_type; @@ -339,14 +349,26 @@ m4_define([b4_public_types_define], , location ()])[ {} +#if 201103L <= YY_CPLUSPLUS + template <typename Base> + ]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (basic_symbol&& that) + : Base (std::move (that)) + , value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([ + , location (std::move (that.location))])[ + {]b4_variant_if([ + b4_symbol_variant([this->type_get ()], [value], [move], + [std::move (that.value)])])[ + } +#endif + template <typename Base> - ]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (YY_RVREF (basic_symbol) that) - : Base (YY_MOVE (that)) - , value (]b4_variant_if([], [YY_MOVE (that.value)]))b4_locations_if([ - , location (YY_MOVE (that.location))])[ + ]b4_parser_class_name[::basic_symbol<Base>::basic_symbol (const basic_symbol& that) + : Base (that) + , value (]b4_variant_if([], [that.value]))b4_locations_if([ + , location (that.location)])[ {]b4_variant_if([ - b4_symbol_variant([this->type_get ()], [value], [YY_MOVE_OR_COPY], - [YY_MOVE (that.value)])])[ + b4_symbol_variant([this->type_get ()], [value], [copy], + [that.value])])[ } ]b4_variant_if([[ @@ -429,11 +451,11 @@ m4_define([b4_public_types_define], { that.clear (); } -#else +#endif + ]b4_inline([$1])b4_parser_class_name[::by_type::by_type (const by_type& that) : type (that.type) {} -#endif ]b4_inline([$1])b4_parser_class_name[::by_type::by_type (token_type t) : type (yytranslate_ (t)) diff --git a/tests/c++.at b/tests/c++.at index ed15ead1..cda35cdc 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -171,6 +171,14 @@ int main() } #endif + // symbol_type: copy constructor. + { + parser::symbol_type s = parser::make_INT (51); + parser::symbol_type s2 = s; + assert_eq (s.value.as<int> (), 51); + assert_eq (s2.value.as<int> (), 51); + } + // stack_symbol_type: construction, accessor. { #if 201103L <= YY_CPLUSPLUS
