Browse Source

GCC 4.5 compatibility: can't list-initialize array of classes.

Awesome bug. In GCC 4.6 it throws plenty of ungoogleable `-pedantic`
warnings and in GCC 4.5 it fails directly with "error: bad array
initializer". Fallback to initialization using for-cycle.

Worked around that in 4.6 by disabling `-pedantic` warnings, must be
done this way on 4.5 & 4.4. Hopefully the performance won't be harmed
too much.
Vladimír Vondruš 13 years ago
parent
commit
cb7a0f6404
  1. 2
      src/CMakeLists.txt
  2. 19
      src/Math/RectangularMatrix.h

2
src/CMakeLists.txt

@ -25,7 +25,7 @@
# Disable `-pedantic` for GCC 4.6, as the compiler doesn't like
# list-initialization of array of classes (RectangularMatrix constructors). It
# is perfectly legal C++11 and both GCC 4.7 and Clang accept it without notice.
if(CORRADE_GCC46_COMPATIBILITY)
if(CORRADE_GCC46_COMPATIBILITY AND NOT CORRADE_GCC45_COMPATIBILITY)
string(REPLACE "-pedantic" "" CORRADE_CXX_FLAGS "${CORRADE_CXX_FLAGS}")
endif()

19
src/Math/RectangularMatrix.h

@ -106,7 +106,12 @@ template<std::size_t cols, std::size_t rows, class T> class RectangularMatrix {
*
* @todo Creating matrix from arbitrary combination of matrices with n rows
*/
#ifndef CORRADE_GCC45_COMPATIBILITY
template<class ...U> inline constexpr /*implicit*/ RectangularMatrix(const Vector<rows, T>& first, const U&... next): _data{first, next...} {
#else
template<class ...U> inline /*implicit*/ RectangularMatrix(const Vector<rows, T>& first, const U&... next): _data() {
constructInternal({first, next...});
#endif
static_assert(sizeof...(next)+1 == cols, "Improper number of arguments passed to RectangularMatrix constructor");
}
@ -443,7 +448,21 @@ template<std::size_t cols, std::size_t rows, class T> class RectangularMatrix {
private:
/* Implementation for RectangularMatrix<cols, rows, T>::RectangularMatrix(const RectangularMatrix<cols, rows, U>&) */
#ifndef CORRADE_GCC45_COMPATIBILITY
template<class U, std::size_t ...sequence> inline constexpr explicit RectangularMatrix(Implementation::Sequence<sequence...>, const RectangularMatrix<cols, rows, U>& matrix): _data{Vector<rows, T>(matrix[sequence])...} {}
#else
template<class U, std::size_t ...sequence> inline explicit RectangularMatrix(Implementation::Sequence<sequence...>, const RectangularMatrix<cols, rows, U>& matrix): _data() {
constructInternal({Vector<rows, T>(matrix[sequence])...});
}
#endif
#ifdef CORRADE_GCC45_COMPATIBILITY
/* GCC < 4.6 workaround for "error: bad array initializer" */
inline void constructInternal(std::initializer_list<Vector<rows, T>> data) {
for(std::size_t i = 0; i != data.size(); ++i)
_data[i] = *(data.begin() + i);
}
#endif
Vector<rows, T> _data[cols];
};

Loading…
Cancel
Save