From: Samuel Tardieu Date: Mon, 24 Nov 2008 14:27:49 +0000 (+0100) Subject: Force a large alignment of a variant structure. X-Git-Tag: v2.7.90~955 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/253192e69ac11f75d97e425ec337b66f4d3c6115 Force a large alignment of a variant structure. This is a temporary band-aid until Bison gets proper alignment handling. We need it on ARM. * data/lalr1.cc (variant): Declare the buffer as a union to force the same alignment as "long double". --- diff --git a/data/lalr1.cc b/data/lalr1.cc index 49f4bf77..54b7038b 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -433,7 +433,7 @@ dnl FIXME: This is wrong, we want computed header guards. {]b4_assert_if([ assert(!built); built = true;])[ - return *new (buffer) T; + return *new (buffer.raw) T; } /// Instantiate a \a T in here from \a t. @@ -443,7 +443,7 @@ dnl FIXME: This is wrong, we want computed header guards. {]b4_assert_if([ assert(!built); built = true;])[ - return *new (buffer) T(t); + return *new (buffer.raw) T(t); } /// Construct and fill. @@ -452,7 +452,7 @@ dnl FIXME: This is wrong, we want computed header guards. variant (const T& t)]b4_assert_if([ : built(true)])[ { - new (buffer) T(t); + new (buffer.raw) T(t); } /// Accessor to a built \a T. @@ -461,7 +461,7 @@ dnl FIXME: This is wrong, we want computed header guards. as() {]b4_assert_if([ assert(built);])[ - return reinterpret_cast(buffer); + return reinterpret_cast(buffer.raw); } /// Const accessor to a built \a T (for %printer). @@ -470,7 +470,7 @@ dnl FIXME: This is wrong, we want computed header guards. as() const {]b4_assert_if([ assert(built);])[ - return reinterpret_cast(buffer); + return reinterpret_cast(buffer.raw); } /// Swap the content with \a other. @@ -502,7 +502,12 @@ dnl FIXME: This is wrong, we want computed header guards. } /// A buffer large enough to store any of the semantic values. - char buffer[S]; + /// Long double is chosen as it has the strongest alignment + /// constraints. + union { + long double align_me; + char raw[S]; + } buffer; }; ]])[ ]b4_namespace_close[