Browse Source

MSVC 2015 compatibility: Math copy/conversion constexpr issues.

I don't know why, but marking the output of copy constructor of any
subclass or output of conversion operator of any class as constexpr
causes MSVC to complain about non-constant expression.

Probably just another bug.
pull/107/head
Vladimír Vondruš 11 years ago
parent
commit
d7e507a2a7
  1. 10
      src/Magnum/Math/Test/ColorTest.cpp
  2. 5
      src/Magnum/Math/Test/ComplexTest.cpp
  3. 10
      src/Magnum/Math/Test/DualComplexTest.cpp
  4. 10
      src/Magnum/Math/Test/DualQuaternionTest.cpp
  5. 35
      src/Magnum/Math/Test/Matrix3Test.cpp
  6. 40
      src/Magnum/Math/Test/Matrix4Test.cpp
  7. 10
      src/Magnum/Math/Test/MatrixTest.cpp
  8. 5
      src/Magnum/Math/Test/QuaternionTest.cpp
  9. 15
      src/Magnum/Math/Test/RangeTest.cpp
  10. 20
      src/Magnum/Math/Test/RectangularMatrixTest.cpp
  11. 10
      src/Magnum/Math/Test/Vector2Test.cpp
  12. 10
      src/Magnum/Math/Test/Vector3Test.cpp
  13. 20
      src/Magnum/Math/Test/Vector4Test.cpp
  14. 15
      src/Magnum/Math/Test/VectorTest.cpp

10
src/Magnum/Math/Test/ColorTest.cpp

@ -203,11 +203,17 @@ void ColorTest::constructNormalization() {
void ColorTest::constructCopy() {
constexpr Math::Vector<3, Float> a(1.0f, 0.5f, 0.75f);
constexpr Color3 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Color3 b(a);
CORRADE_COMPARE(b, Color3(1.0f, 0.5f, 0.75f));
constexpr Math::Vector<4, Float> c(1.0f, 0.5f, 0.75f, 0.25f);
constexpr Color4 d(c);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Color4 d(c);
CORRADE_COMPARE(d, Color4(1.0f, 0.5f, 0.75f, 0.25f));
}

5
src/Magnum/Math/Test/ComplexTest.cpp

@ -196,7 +196,10 @@ void ComplexTest::convert() {
Complex c(a);
CORRADE_COMPARE(c, b);
constexpr Cmpl d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Cmpl d(b);
CORRADE_COMPARE(d.re, a.re);
CORRADE_COMPARE(d.im, a.im);

10
src/Magnum/Math/Test/DualComplexTest.cpp

@ -171,7 +171,10 @@ void DualComplexTest::constructFromVector() {
void DualComplexTest::constructCopy() {
constexpr Math::Dual<Complex> a({-1.0f, 2.5f}, {3.0f, -7.5f});
constexpr DualComplex b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
DualComplex b(a);
CORRADE_COMPARE(b, DualComplex({-1.0f, 2.5f}, {3.0f, -7.5f}));
}
@ -190,7 +193,10 @@ void DualComplexTest::convert() {
DualComplex c{a};
CORRADE_COMPARE(c, b);
constexpr DualCmpl d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
DualCmpl d(b);
CORRADE_COMPARE(d.re, a.re);
CORRADE_COMPARE(d.im, a.im);
CORRADE_COMPARE(d.x, a.x);

10
src/Magnum/Math/Test/DualQuaternionTest.cpp

@ -172,7 +172,10 @@ void DualQuaternionTest::constructFromVector() {
void DualQuaternionTest::constructCopy() {
constexpr Math::Dual<Quaternion> a({{1.0f, 2.0f, -3.0f}, -3.5f}, {{4.5f, -7.0f, 2.0f}, 1.0f});
constexpr DualQuaternion b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
DualQuaternion b(a);
CORRADE_COMPARE(b, DualQuaternion({{1.0f, 2.0f, -3.0f}, -3.5f}, {{4.5f, -7.0f, 2.0f}, 1.0f}));
}
@ -191,7 +194,10 @@ void DualQuaternionTest::convert() {
DualQuaternion c{a};
CORRADE_COMPARE(c, b);
constexpr DualQuat d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
DualQuat d(b);
CORRADE_COMPARE(d.re.x, a.re.x);
CORRADE_COMPARE(d.re.y, a.re.y);
CORRADE_COMPARE(d.re.z, a.re.z);

35
src/Magnum/Math/Test/Matrix3Test.cpp

@ -190,7 +190,10 @@ void Matrix3Test::constructCopy() {
constexpr RectangularMatrix<3, 3, Float> a(Vector<3, Float>(3.0f, 5.0f, 8.0f),
Vector<3, Float>(4.5f, 4.0f, 7.0f),
Vector<3, Float>(7.9f, -1.0f, 8.0f));
constexpr Matrix3 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Matrix3 b(a);
CORRADE_COMPARE(b, Matrix3({3.0f, 5.0f, 8.0f},
{4.5f, 4.0f, 7.0f},
{7.9f, -1.0f, 8.0f}));
@ -207,7 +210,10 @@ void Matrix3Test::convert() {
constexpr Matrix3 c(b);
CORRADE_COMPARE(c, b);
constexpr Mat3 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Mat3 d(b);
for(std::size_t i = 0; i != 9; ++i)
CORRADE_COMPARE(d.a[0], a.a[0]);
@ -301,7 +307,10 @@ void Matrix3Test::fromParts() {
constexpr Matrix2x2 rotationScaling(Vector2(3.0f, 5.0f),
Vector2(4.0f, 4.0f));
constexpr Vector2 translation(7.0f, -1.0f);
constexpr Matrix3 a = Matrix3::from(rotationScaling, translation);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Matrix3 a = Matrix3::from(rotationScaling, translation);
CORRADE_COMPARE(a, Matrix3({3.0f, 5.0f, 0.0f},
{4.0f, 4.0f, 0.0f},
@ -312,7 +321,10 @@ void Matrix3Test::rotationScalingPart() {
constexpr Matrix3 a({3.0f, 5.0f, 8.0f},
{4.0f, 4.0f, 7.0f},
{7.0f, -1.0f, 8.0f});
constexpr Matrix2x2 b = a.rotationScaling();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Matrix2x2 b = a.rotationScaling();
CORRADE_COMPARE(b, Matrix2x2(Vector2(3.0f, 5.0f),
Vector2(4.0f, 4.0f)));
@ -380,9 +392,18 @@ void Matrix3Test::vectorParts() {
constexpr Matrix3 a({15.0f, 0.0f, 0.0f},
{ 0.0f, -3.0f, 0.0f},
{-5.0f, 12.0f, 1.0f});
constexpr Vector2 right = a.right();
constexpr Vector2 up = a.up();
constexpr Vector2 translation = a.translation();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector2 right = a.right();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector2 up = a.up();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector2 translation = a.translation();
CORRADE_COMPARE(right, Vector2::xAxis(15.0f));
CORRADE_COMPARE(up, Vector2::yAxis(-3.0f));

40
src/Magnum/Math/Test/Matrix4Test.cpp

@ -219,7 +219,10 @@ void Matrix4Test::constructCopy() {
Vector<4, Float>(4.5f, 4.0f, 7.0f, 2.0f),
Vector<4, Float>(1.0f, 2.0f, 3.0f, -1.0f),
Vector<4, Float>(7.9f, -1.0f, 8.0f, -1.5f));
constexpr Matrix4 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Matrix4 b(a);
CORRADE_COMPARE(b, Matrix4({3.0f, 5.0f, 8.0f, -3.0f},
{4.5f, 4.0f, 7.0f, 2.0f},
{1.0f, 2.0f, 3.0f, -1.0f},
@ -239,7 +242,10 @@ void Matrix4Test::convert() {
constexpr Matrix4 c(b);
CORRADE_COMPARE(c, b);
constexpr Mat4 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Mat4 d(b);
for(std::size_t i = 0; i != 16; ++i)
CORRADE_COMPARE(d.a[i], a.a[i]);
@ -400,7 +406,10 @@ void Matrix4Test::fromParts() {
Vector3(4.0f, 4.0f, 7.0f),
Vector3(7.0f, -1.0f, 8.0f));
constexpr Vector3 translation(9.0f, 4.0f, 5.0f);
constexpr Matrix4 a = Matrix4::from(rotationScaling, translation);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Matrix4 a = Matrix4::from(rotationScaling, translation);
CORRADE_COMPARE(a, Matrix4({3.0f, 5.0f, 8.0f, 0.0f},
{4.0f, 4.0f, 7.0f, 0.0f},
@ -413,7 +422,10 @@ void Matrix4Test::rotationScalingPart() {
{4.0f, 4.0f, 7.0f, 3.0f},
{7.0f, -1.0f, 8.0f, 0.0f},
{9.0f, 4.0f, 5.0f, 9.0f});
constexpr Matrix3x3 b = a.rotationScaling();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Matrix3x3 b = a.rotationScaling();
CORRADE_COMPARE(b, Matrix3x3(Vector3(3.0f, 5.0f, 8.0f),
Vector3(4.0f, 4.0f, 7.0f),
@ -486,10 +498,22 @@ void Matrix4Test::vectorParts() {
{ 0.0f, 12.0f, 0.0f, 0.0f},
{ 0.0f, 0.0f, 35.0f, 0.0f},
{-5.0f, 12.0f, 0.5f, 1.0f});
constexpr Vector3 right = a.right();
constexpr Vector3 up = a.up();
constexpr Vector3 backward = a.backward();
constexpr Vector3 translation = a.translation();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector3 right = a.right();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector3 up = a.up();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector3 backward = a.backward();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector3 translation = a.translation();
CORRADE_COMPARE(right, Vector3::xAxis(-1.0f));
CORRADE_COMPARE(up, Vector3::yAxis(12.0f));

10
src/Magnum/Math/Test/MatrixTest.cpp

@ -185,7 +185,10 @@ void MatrixTest::constructCopy() {
Vector4(4.5f, 4.0f, 7.0f, 2.0f),
Vector4(1.0f, 2.0f, 3.0f, -1.0f),
Vector4(7.9f, -1.0f, 8.0f, -1.5f));
constexpr Matrix4x4 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Matrix4x4 b(a);
CORRADE_COMPARE(b, Matrix4x4(Vector4(3.0f, 5.0f, 8.0f, -3.0f),
Vector4(4.5f, 4.0f, 7.0f, 2.0f),
Vector4(1.0f, 2.0f, 3.0f, -1.0f),
@ -203,7 +206,10 @@ void MatrixTest::convert() {
constexpr Matrix3x3 c(b);
CORRADE_COMPARE(c, b);
constexpr Mat3 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Mat3 d(b);
for(std::size_t i = 0; i != 9; ++i)
CORRADE_COMPARE(d.a[i], a.a[i]);

5
src/Magnum/Math/Test/QuaternionTest.cpp

@ -197,7 +197,10 @@ void QuaternionTest::convert() {
Quaternion c{a};
CORRADE_COMPARE(c, b);
constexpr Quat d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Quat d(b);
CORRADE_COMPARE(d.x, a.x);
CORRADE_COMPARE(d.y, a.y);
CORRADE_COMPARE(d.z, a.z);

15
src/Magnum/Math/Test/RangeTest.cpp

@ -284,17 +284,26 @@ void RangeTest::convert() {
CORRADE_COMPARE(i, e);
CORRADE_COMPARE(j, f);
constexpr Dim k(d);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Dim k(d);
CORRADE_COMPARE(k.offset, a.offset);
CORRADE_COMPARE(k.size, a.size);
constexpr Rect l(e);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Rect l(e);
CORRADE_COMPARE(l.x, b.x);
CORRADE_COMPARE(l.y, b.y);
CORRADE_COMPARE(l.w, b.w);
CORRADE_COMPARE(l.h, b.h);
constexpr Box m(f);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Box m(f);
CORRADE_COMPARE(m.x, c.x);
CORRADE_COMPARE(m.y, c.y);
CORRADE_COMPARE(m.z, c.z);

20
src/Magnum/Math/Test/RectangularMatrixTest.cpp

@ -246,7 +246,10 @@ void RectangularMatrixTest::convert() {
Matrix2x3 c{a};
CORRADE_COMPARE(c, b);
constexpr Mat2x3 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Mat2x3 d(b);
for(std::size_t i = 0; i != 5; ++i)
CORRADE_COMPARE(d.a[i], a.a[i]);
@ -275,7 +278,10 @@ void RectangularMatrixTest::data() {
constexpr Matrix3x4 a(Vector4(3.0f, 5.0f, 8.0f, 4.0f),
Vector4(4.5f, 4.0f, 7.0f, 3.0f),
Vector4(7.0f, -1.7f, 8.0f, 0.0f));
constexpr Vector4 b = a[2];
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector4 b = a[2];
constexpr Float c = a[1][2];
constexpr Float d = *a.data();
CORRADE_COMPARE(b, Vector4(7.0f, -1.7f, 8.0f, 0.0f));
@ -416,13 +422,19 @@ void RectangularMatrixTest::diagonal() {
Vector3( 4.0f, 5.0f, 7.0f),
Vector3( 8.0f, 9.0f, 11.0f),
Vector3(12.0f, 13.0f, 15.0f));
constexpr Vector3 aDiagonal = a.diagonal();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector3 aDiagonal = a.diagonal();
CORRADE_COMPARE(aDiagonal, diagonal);
constexpr Matrix3x4 b(Vector4(-1.0f, 4.0f, 8.0f, 12.0f),
Vector4( 1.0f, 5.0f, 9.0f, 13.0f),
Vector4( 3.0f, 7.0f, 11.0f, 15.0f));
constexpr Vector3 bDiagonal = b.diagonal();
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector3 bDiagonal = b.diagonal();
CORRADE_COMPARE(bDiagonal, diagonal);
}

10
src/Magnum/Math/Test/Vector2Test.cpp

@ -138,7 +138,10 @@ void Vector2Test::constructConversion() {
void Vector2Test::constructCopy() {
constexpr Vector<2, Float> a(1.5f, 2.5f);
constexpr Vector2 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Vector2 b(a);
CORRADE_COMPARE(b, Vector2(1.5f, 2.5f));
}
@ -149,7 +152,10 @@ void Vector2Test::convert() {
constexpr Vector2 c(a);
CORRADE_COMPARE(c, b);
constexpr Vec2 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Vec2 d(b);
CORRADE_COMPARE(d.x, a.x);
CORRADE_COMPARE(d.y, a.y);

10
src/Magnum/Math/Test/Vector3Test.cpp

@ -142,7 +142,10 @@ void Vector3Test::constructConversion() {
void Vector3Test::constructCopy() {
constexpr Vector<3, Float> a(1.0f, 2.5f, -3.0f);
constexpr Vector3 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Vector3 b(a);
CORRADE_COMPARE(b, Vector3(1.0f, 2.5f, -3.0f));
}
@ -153,7 +156,10 @@ void Vector3Test::convert() {
constexpr Vector3 c(a);
CORRADE_COMPARE(c, b);
constexpr Vec3 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Vec3 d(b);
CORRADE_COMPARE(d.x, a.x);
CORRADE_COMPARE(d.y, a.y);
CORRADE_COMPARE(d.z, a.z);

20
src/Magnum/Math/Test/Vector4Test.cpp

@ -105,8 +105,14 @@ void Vector4Test::construct() {
void Vector4Test::constructPad() {
constexpr Vector<2, Float> a{3.0f, -1.0f};
constexpr Vector4 b = Vector4::pad(a);
constexpr Vector4 c = Vector4::pad(a, 5.0f);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector4 b = Vector4::pad(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vector4 c = Vector4::pad(a, 5.0f);
constexpr Vector4 d = Vector4::pad(a, 5.0f, 1.0f);
CORRADE_COMPARE(b, Vector4(3.0f, -1.0f, 0.0f, 0.0f));
CORRADE_COMPARE(c, Vector4(3.0f, -1.0f, 5.0f, 5.0f));
@ -151,7 +157,10 @@ void Vector4Test::constructConversion() {
void Vector4Test::constructCopy() {
constexpr Vector<4, Float> a(1.0f, -2.5f, 3.0f, 4.1f);
constexpr Vector4 b(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be copy constexpr? */
constexpr
#endif
Vector4 b(a);
CORRADE_COMPARE(b, Vector4(1.0f, -2.5f, 3.0f, 4.1f));
}
@ -162,7 +171,10 @@ void Vector4Test::convert() {
constexpr Vector4 c(a);
CORRADE_COMPARE(c, b);
constexpr Vec4 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Vec4 d(b);
CORRADE_COMPARE(d.x, a.x);
CORRADE_COMPARE(d.y, a.y);
CORRADE_COMPARE(d.z, a.z);

15
src/Magnum/Math/Test/VectorTest.cpp

@ -256,7 +256,10 @@ void VectorTest::convert() {
Vector3 c{a};
CORRADE_COMPARE(c, b);
constexpr Vec3 d(b);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Why can't be conversion constexpr? */
constexpr
#endif
Vec3 d(b);
CORRADE_COMPARE(d.x, a.x);
CORRADE_COMPARE(d.y, a.y);
CORRADE_COMPARE(d.z, a.z);
@ -567,8 +570,14 @@ void VectorTest::subclass() {
{
constexpr Vector<1, Float> a = 5.0f;
constexpr Vec2 b = Vec2::pad(a);
constexpr Vec2 c = Vec2::pad(a, -1.0f);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vec2 b = Vec2::pad(a);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Probably because copy is not constexpr */
constexpr
#endif
Vec2 c = Vec2::pad(a, -1.0f);
CORRADE_COMPARE(b, Vec2(5.0f, 0.0f));
CORRADE_COMPARE(c, Vec2(5.0f, -1.0f));
}

Loading…
Cancel
Save