[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
maint: c++: also provide a copy constructor for symbol_type
From: |
Akim Demaille |
Subject: |
maint: c++: also provide a copy constructor for symbol_type |
Date: |
Mon, 24 Dec 2018 18:42:08 +0100 |
Was part of 3.2.4.
commit cafa811a661e166c54fb4b34b1d6bf8451cc8748
Author: Akim Demaille <address@hidden>
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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- maint: c++: also provide a copy constructor for symbol_type,
Akim Demaille <=