boost/optional/optional.hpp: avoid gcc 3.2 warnings

[SVN r67109]
This commit is contained in:
Ralf W. Grosse-Kunstleve
2010-12-08 17:53:29 +00:00
parent f88c8ae423
commit d39627c5b6

View File

@ -103,6 +103,12 @@ class typed_in_place_factory_base ;
namespace optional_detail { namespace optional_detail {
#if defined(__GNUC__) \
&& !(__GNUC__ == 3 && __GNUC_MINOR__ == 2) \
&& !defined(__INTEL_COMPILER)
#define BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS
#endif
// This local class is used instead of that in "aligned_storage.hpp" // This local class is used instead of that in "aligned_storage.hpp"
// because I've found the 'official' class to ICE BCB5.5 // because I've found the 'official' class to ICE BCB5.5
// when some types are used with optional<> // when some types are used with optional<>
@ -112,8 +118,8 @@ class aligned_storage
{ {
// Borland ICEs if unnamed unions are used for this! // Borland ICEs if unnamed unions are used for this!
union union
#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
// This works around GCC warnings about breaking strict aliasing rules when casting storage address to T* // This works around GCC warnings about breaking strict aliasing rules when casting storage address to T*
#if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS)
__attribute__((may_alias)) __attribute__((may_alias))
#endif #endif
dummy_u dummy_u
@ -125,7 +131,7 @@ class aligned_storage
public: public:
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) #if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS)
void const* address() const { return &dummy_; } void const* address() const { return &dummy_; }
void * address() { return &dummy_; } void * address() { return &dummy_; }
#else #else
@ -437,7 +443,7 @@ class optional_base : public optional_tag
private : private :
// internal_type can be either T or reference_content<T> // internal_type can be either T or reference_content<T>
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) #if defined(BOOST_OPTIONAL_DETAIL_USE_ATTRIBUTE_MAY_ALIAS)
// This workaround is supposed to silence GCC warnings about broken strict aliasing rules // This workaround is supposed to silence GCC warnings about broken strict aliasing rules
internal_type const* get_object() const internal_type const* get_object() const
{ {