// Copyright (C) 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include class tst_qxp_is_virtual_base_of : public QObject { Q_OBJECT }; class Base { public: virtual ~Base() {} }; // Only works with classes static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); // A class isn't a virtual base of itself static_assert(!qxp::is_virtual_base_of_v); // Non-virtual bases class NonVirtualDerived : public Base {}; class NonVirtualPrivateDerived : private Base {}; static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); // Virtual bases class VirtualDerived1 : public virtual Base {}; class VirtualDerived2 : public virtual Base {}; class VirtualDerived3 : public VirtualDerived1, public VirtualDerived2 {}; class VirtualDerived4 : public VirtualDerived3, public virtual Base {}; class VirtualPrivateDerived : private virtual Base {}; static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Winaccessible-base") QT_WARNING_DISABLE_CLANG("-Winaccessible-base") // Ambiguous non-virtual base class IntermediateDerived : public Base {}; class AmbiguousBase1 : public IntermediateDerived, public Base {}; class AmbiguousBase2 : public IntermediateDerived, public virtual Base {}; static_assert(!qxp::is_virtual_base_of_v); #ifndef Q_CC_MSVC_ONLY // https://developercommunity.visualstudio.com/t/c-templates-multiple-inheritance-ambiguous-access/185674 static_assert(!qxp::is_virtual_base_of_v); #endif QT_WARNING_POP // Const static_assert(!qxp::is_virtual_base_of_v< Base, const NonVirtualDerived>); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v< Base, const NonVirtualPrivateDerived>); static_assert(!qxp::is_virtual_base_of_v); static_assert(!qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived1>); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived2>); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived3>); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived4>); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived4>); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v< Base, const VirtualPrivateDerived>); static_assert(qxp::is_virtual_base_of_v); static_assert(qxp::is_virtual_base_of_v); QTEST_APPLESS_MAIN(tst_qxp_is_virtual_base_of); #include "tst_is_virtual_base_of.moc"