From db6c6a633199691c6a70e027af69d58751aa4d14 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Wed, 16 Jul 2014 22:18:13 +0100 Subject: [PATCH] fixing GCC and Clang warnings and errors --- src/blackmisc/iterator.h | 1 + src/blackmisc/optional.h | 21 +++++++++++++++++---- src/blackmisc/range.h | 6 +++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/blackmisc/iterator.h b/src/blackmisc/iterator.h index 27991a46e..d09965934 100644 --- a/src/blackmisc/iterator.h +++ b/src/blackmisc/iterator.h @@ -195,6 +195,7 @@ namespace BlackMisc void checkEnd(const ConditionalIterator &other) // debugging { Q_ASSERT(m_end == other.m_end && m_end == other.m_iterator); + Q_UNUSED(other); } private: diff --git a/src/blackmisc/optional.h b/src/blackmisc/optional.h index 414ad2c44..982f28656 100644 --- a/src/blackmisc/optional.h +++ b/src/blackmisc/optional.h @@ -75,20 +75,33 @@ namespace BlackMisc explicit operator bool() const { return m_isValid; } //! Dereference operator, returns reference to contained value, undefined if there is no value contained. - T &operator *() { Q_ASSERT(m_isValid); return *reinterpret_cast(m_bytes); } + T &operator *() { return dereference(); } //! Dereference operator, returns reference to contained value, undefined if there is no value contained. - const T &operator *() const { Q_ASSERT(m_isValid); return *reinterpret_cast(m_bytes); } + const T &operator *() const { return dereference(); } //! Indirection operator, returns pointer to contained value, undefined if there is no value contained. - T *operator ->() { Q_ASSERT(m_isValid); return reinterpret_cast(m_bytes); } + T *operator ->() { return &dereference(); } //! Indirection operator, returns pointer to contained value, undefined if there is no value contained. - const T *operator ->() const { Q_ASSERT(m_isValid); return reinterpret_cast(m_bytes); } + const T *operator ->() const { return &dereference(); } private: bool m_isValid; + +#if defined(Q_COMPILER_UNRESTRICTED_UNIONS) + T &dereference() { Q_ASSERT(m_isValid); return m_obj; } + const T &dereference() const { Q_ASSERT(m_isValid); return m_obj; } + union + { + char m_bytes[sizeof(T)]; + T m_obj; + }; +#else + T &dereference() { Q_ASSERT(m_isValid); return *reinterpret_cast(m_bytes); } + const T &dereference() const { Q_ASSERT(m_isValid); return *reinterpret_cast(m_bytes); } char m_bytes[sizeof(T)]; +#endif }; /*! diff --git a/src/blackmisc/range.h b/src/blackmisc/range.h index fc797f8f3..1e38a4ddd 100644 --- a/src/blackmisc/range.h +++ b/src/blackmisc/range.h @@ -124,7 +124,7 @@ namespace BlackMisc //! @} //! Constructor. - CRange(I begin, I end) : m_begin(begin), m_end(end) { check(begin, end); } + CRange(I begin, I end) : m_begin(begin), m_end(end) { check(&begin, &end); } //! Begin and end iterators. //! @{ @@ -170,9 +170,9 @@ namespace BlackMisc I m_end; void check(...) {}; - template void check(Iterators::ConditionalIterator begin, Iterators::ConditionalIterator end) + template void check(Iterators::ConditionalIterator *begin, Iterators::ConditionalIterator *end) { - begin.checkEnd(end); + begin->checkEnd(*end); } };