bison-patches
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]