2007-10-20 Martin Sebor <sebor@roguewave.com> Merged rev 586811 from branches/4.2.x with a fix for STDCXX-350. * _rawiter.h [__GNUG__ >= 4] (get_temporary_buffer, return_temporary_buffer): Used __attribute__ (may_alias) to tell the gcc optimizier about type-punning in a reinterpret_cast() and to silence warning: dereferencing type-punned pointer will break strict-aliasing rules. git-svn-id: https://svn.apache.org/repos/asf/incubator/stdcxx/branches/4.2.0@586813 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/include/rw/_rawiter.h b/include/rw/_rawiter.h index ebfcfc0..3deb6f9 100644 --- a/include/rw/_rawiter.h +++ b/include/rw/_rawiter.h
@@ -36,7 +36,7 @@ * implied. See the License for the specific language governing * permissions and limitations under the License. * - * Copyright 1994-2006 Rogue Wave Software. + * Copyright 1994-2007 Rogue Wave Software, Inc. * **************************************************************************/ @@ -135,8 +135,19 @@ { pair<_TypeT*, _Distance> __res (0, 0); +#if __GNUG__ >= 4 + + // tell gcc 4 about type-punning in the cast below + typedef void* __attribute__ ((__may_alias__)) _VoidPtrT; + +#else // !gcc || gcc < 4 + + typedef void* _VoidPtrT; + +#endif // gcc + __res.second = - _RW::__rw_tmpbuf (_RWSTD_REINTERPRET_CAST (void**, &__res.first), + _RW::__rw_tmpbuf (_RWSTD_REINTERPRET_CAST (_VoidPtrT*, &__res.first), __nelems < 0 ? 0 : __nelems, sizeof (_TypeT)); return __res; @@ -161,7 +172,18 @@ inline void return_temporary_buffer (_TypeT *__p) { - _RW::__rw_tmpbuf (_RWSTD_REINTERPRET_CAST (void**, &__p), +#if __GNUG__ >= 4 + + // tell gcc 4 about type-punning in the cast below + typedef void* __attribute__ ((__may_alias__)) _VoidPtrT; + +#else // !gcc || gcc < 4 + + typedef void* _VoidPtrT; + +#endif // gcc + + _RW::__rw_tmpbuf (_RWSTD_REINTERPRET_CAST (_VoidPtrT*, &__p), 0, sizeof (_TypeT)); }