bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/8] variant: fix G++ 4.4 warnings


From: Akim Demaille
Subject: [PATCH 2/8] variant: fix G++ 4.4 warnings
Date: Tue, 19 Feb 2013 17:50:35 +0100

The changes by Théophile Ranquet about type punning issues need
to be extend to in-place new to please G++ 4.4.7.

* data/variant.hh (variant::as_): New, factors the casts that avoid
compiler warnings.
(as, build): Use them.
---
 data/variant.hh | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/data/variant.hh b/data/variant.hh
index 91548d8..c360843 100644
--- a/data/variant.hh
+++ b/data/variant.hh
@@ -104,7 +104,7 @@ m4_define([b4_variant_define],
       : tname (typeid (T).name ())])[
     {
       YYASSERT (sizeof (T) <= S);
-      new (buffer.raw) T (t);
+      new (as_ <T> ()) T (t);
     }
 
     /// Destruction, allowed only if empty.
@@ -121,7 +121,7 @@ m4_define([b4_variant_define],
       YYASSERT (!tname);
       YYASSERT (sizeof (T) <= S);
       tname = typeid (T).name ();])[
-      return *new (buffer.raw) T;
+      return *new (as_<T> ()) T;
     }
 
     /// Instantiate a \a T in here from \a t.
@@ -132,7 +132,7 @@ m4_define([b4_variant_define],
       YYASSERT (!tname);
       YYASSERT (sizeof (T) <= S);
       tname = typeid (T).name ();])[
-      return *new (buffer.raw) T (t);
+      return *new (as_<T> ()) T (t);
     }
 
     /// Accessor to a built \a T.
@@ -142,10 +142,7 @@ m4_define([b4_variant_define],
     {]b4_parse_assert_if([
       YYASSERT (tname == typeid (T).name ());
       YYASSERT (sizeof (T) <= S);])[
-      {
-        void *dummy = buffer.raw;
-        return *static_cast<T*> (dummy);
-      }
+      return *as_<T> ();
     }
 
     /// Const accessor to a built \a T (for %printer).
@@ -155,10 +152,7 @@ m4_define([b4_variant_define],
     {]b4_parse_assert_if([
       YYASSERT (tname == typeid (T).name ());
       YYASSERT (sizeof (T) <= S);])[
-      {
-        const void *dummy = buffer.raw;
-        return *static_cast<const T*> (dummy);
-      }
+      return *as_<T> ();
     }
 
     /// Swap the content with \a other, of same type.
@@ -213,6 +207,24 @@ m4_define([b4_variant_define],
     self_type& operator=(const self_type&);
     variant (const self_type&);
 
+    /// Accessor to raw memory as \a T.
+    template <typename T>
+    T*
+    as_ ()
+    {
+      void *yyp = buffer.raw;
+      return static_cast<T*> (yyp);
+     }
+
+    /// Const accessor to raw memory as \a T.
+    template <typename T>
+    const T*
+    as_ () const
+    {
+      const void *yyp = buffer.raw;
+      return static_cast<const T*> (yyp);
+     }
+
     /// A buffer large enough to store any of the semantic values.
     /// Long double is chosen as it has the strongest alignment
     /// constraints.
-- 
1.8.1.3




reply via email to

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