From cda3709af96c2964d894176e8461b36bc8981319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 1 Mar 2025 16:26:42 +0100 Subject: [PATCH] SceneGraph: work around -Wnon-virtual-dtor on GCC and Clang. This warning isn't enabled by default by either -Wall or -Wextra, and for a good reason. When I do that, it fires also for all uses of Platform::Application, basically any subclass causes that warning to be printed as well, even if given subclass is used just once, in an anonymous namespace, and only through the MAGNUM_APPLICATION_MAIN() macro. The only solution on Clang is to make such subclasses `final`, but on GCC not even that helps and one is forced to really make the base destructor virtual. Which doesn't achieve anything, only adds yet another entry to the vtable. So, in the SceneGraph it fixes one particular use case where the warning was triggered, and since the fix isn't so invasive I'm fine with that. For Platform I have no idea how an acceptable fix would look like, so I hope nobody needs any of that anytime soon. See also https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102168, especially the part saying "This warning should not be used.". --- doc/changelog.dox | 5 +++++ src/Magnum/SceneGraph/DualComplexTransformation.h | 2 ++ src/Magnum/SceneGraph/DualQuaternionTransformation.h | 2 ++ src/Magnum/SceneGraph/MatrixTransformation2D.h | 2 ++ src/Magnum/SceneGraph/MatrixTransformation3D.h | 2 ++ src/Magnum/SceneGraph/RigidMatrixTransformation2D.h | 2 ++ src/Magnum/SceneGraph/RigidMatrixTransformation3D.h | 2 ++ .../SceneGraph/TranslationRotationScalingTransformation2D.h | 2 ++ .../SceneGraph/TranslationRotationScalingTransformation3D.h | 2 ++ src/Magnum/SceneGraph/TranslationTransformation.h | 2 ++ 10 files changed, 23 insertions(+) diff --git a/doc/changelog.dox b/doc/changelog.dox index 946c68808..fce6f9eaf 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -1167,6 +1167,11 @@ See also: - Created a RPM package with a helper script for building (see [mosra/magnum#537](https://github.com/mosra/magnum/pull/537) and [mosra/magnum#650](https://github.com/mosra/magnum/pull/650)) +- Worked around a `-Wnon-virtual-dtor` warning on GCC and Clang in the + @ref SceneGraph library. The same warning (which is off by default) fires + also for any use of @ref Platform application classes, fixing that would + however only add warning suppression noise or force destructors to be + `virtual` for no reason, so it's not done there. See [mosra/magnum#665](https://github.com/mosra/magnum/issues/665). @subsection changelog-latest-bugfixes Bug fixes diff --git a/src/Magnum/SceneGraph/DualComplexTransformation.h b/src/Magnum/SceneGraph/DualComplexTransformation.h index 081151a33..eb2f07c4d 100644 --- a/src/Magnum/SceneGraph/DualComplexTransformation.h +++ b/src/Magnum/SceneGraph/DualComplexTransformation.h @@ -185,6 +185,8 @@ template class BasicDualComplexTransformation: public AbstractBasicTran protected: /* Allow construction only from Object */ explicit BasicDualComplexTransformation() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicDualComplexTransformation() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/DualQuaternionTransformation.h b/src/Magnum/SceneGraph/DualQuaternionTransformation.h index 5360336d1..2abc03c4c 100644 --- a/src/Magnum/SceneGraph/DualQuaternionTransformation.h +++ b/src/Magnum/SceneGraph/DualQuaternionTransformation.h @@ -209,6 +209,8 @@ template class BasicDualQuaternionTransformation: public AbstractBasicT protected: /* Allow construction only from Object */ explicit BasicDualQuaternionTransformation() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicDualQuaternionTransformation() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/MatrixTransformation2D.h b/src/Magnum/SceneGraph/MatrixTransformation2D.h index 91a4befa3..5a2669ff8 100644 --- a/src/Magnum/SceneGraph/MatrixTransformation2D.h +++ b/src/Magnum/SceneGraph/MatrixTransformation2D.h @@ -210,6 +210,8 @@ template class BasicMatrixTransformation2D: public AbstractBasicTransla protected: /* Allow construction only from Object */ explicit BasicMatrixTransformation2D() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicMatrixTransformation2D() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/MatrixTransformation3D.h b/src/Magnum/SceneGraph/MatrixTransformation3D.h index 779ac4a3a..665b4cde2 100644 --- a/src/Magnum/SceneGraph/MatrixTransformation3D.h +++ b/src/Magnum/SceneGraph/MatrixTransformation3D.h @@ -283,6 +283,8 @@ template class BasicMatrixTransformation3D: public AbstractBasicTransla protected: /* Allow construction only from Object */ explicit BasicMatrixTransformation3D() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicMatrixTransformation3D() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h b/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h index 01eeceb65..04495d216 100644 --- a/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h +++ b/src/Magnum/SceneGraph/RigidMatrixTransformation2D.h @@ -210,6 +210,8 @@ template class BasicRigidMatrixTransformation2D: public AbstractBasicTr protected: /* Allow construction only from Object */ explicit BasicRigidMatrixTransformation2D() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicRigidMatrixTransformation2D() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h b/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h index 9fba360ab..bbf06558b 100644 --- a/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h +++ b/src/Magnum/SceneGraph/RigidMatrixTransformation3D.h @@ -282,6 +282,8 @@ template class BasicRigidMatrixTransformation3D: public AbstractBasicTr protected: /* Allow construction only from Object */ explicit BasicRigidMatrixTransformation3D() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicRigidMatrixTransformation3D() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/TranslationRotationScalingTransformation2D.h b/src/Magnum/SceneGraph/TranslationRotationScalingTransformation2D.h index e1f60e552..1c9ff0f93 100644 --- a/src/Magnum/SceneGraph/TranslationRotationScalingTransformation2D.h +++ b/src/Magnum/SceneGraph/TranslationRotationScalingTransformation2D.h @@ -206,6 +206,8 @@ template class BasicTranslationRotationScalingTransformation2D: public protected: /* Allow construction only from Object */ explicit BasicTranslationRotationScalingTransformation2D() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicTranslationRotationScalingTransformation2D() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/TranslationRotationScalingTransformation3D.h b/src/Magnum/SceneGraph/TranslationRotationScalingTransformation3D.h index b6f65494a..2a77e03e5 100644 --- a/src/Magnum/SceneGraph/TranslationRotationScalingTransformation3D.h +++ b/src/Magnum/SceneGraph/TranslationRotationScalingTransformation3D.h @@ -286,6 +286,8 @@ template class BasicTranslationRotationScalingTransformation3D: public protected: /* Allow construction only from Object */ explicit BasicTranslationRotationScalingTransformation3D() = default; + /* To silence -Wnon-virtual-dtor */ + ~BasicTranslationRotationScalingTransformation3D() = default; private: void doResetTransformation() override final { resetTransformation(); } diff --git a/src/Magnum/SceneGraph/TranslationTransformation.h b/src/Magnum/SceneGraph/TranslationTransformation.h index 244d0cdeb..5a3c2776e 100644 --- a/src/Magnum/SceneGraph/TranslationTransformation.h +++ b/src/Magnum/SceneGraph/TranslationTransformation.h @@ -112,6 +112,8 @@ class TranslationTransformation: public AbstractTranslation