From: Akim Demaille Date: Tue, 19 Feb 2013 07:55:15 +0000 (+0100) Subject: variant: fix G++ 4.4 warnings X-Git-Tag: v2.7.90~78 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/85bc7f546609ef28269c44945db09bf44f04015b?hp=1282c12476d19f452392332e725a3509ce0486d2 variant: fix G++ 4.4 warnings 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. --- diff --git a/data/variant.hh b/data/variant.hh index 91548d84..c3608437 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); } /// 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; } /// 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); } /// 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 (dummy); - } + return *as_ (); } /// 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 (dummy); - } + return *as_ (); } /// 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 + T* + as_ () + { + void *yyp = buffer.raw; + return static_cast (yyp); + } + + /// Const accessor to raw memory as \a T. + template + const T* + as_ () const + { + const void *yyp = buffer.raw; + return static_cast (yyp); + } + /// A buffer large enough to store any of the semantic values. /// Long double is chosen as it has the strongest alignment /// constraints.