diff options
Diffstat (limited to 'tests/auto/corelib/global/qxp/is_virtual_base_of')
-rw-r--r-- | tests/auto/corelib/global/qxp/is_virtual_base_of/CMakeLists.txt | 23 | ||||
-rw-r--r-- | tests/auto/corelib/global/qxp/is_virtual_base_of/tst_is_virtual_base_of.cpp | 102 |
2 files changed, 125 insertions, 0 deletions
diff --git a/tests/auto/corelib/global/qxp/is_virtual_base_of/CMakeLists.txt b/tests/auto/corelib/global/qxp/is_virtual_base_of/CMakeLists.txt new file mode 100644 index 0000000000..85a6daab7c --- /dev/null +++ b/tests/auto/corelib/global/qxp/is_virtual_base_of/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qxp_is_virtual_base_of LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + +qt_internal_add_test(tst_qxp_is_virtual_base_of + EXCEPTIONS + SOURCES + tst_is_virtual_base_of.cpp + LIBRARIES + Qt::Core +) + +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90449 +# GCCs < 10 have no way to suppress "inaccessible base" warnings, except by disabling all warnings: +qt_internal_extend_target(tst_qxp_is_virtual_base_of + CONDITION GCC AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10") + COMPILE_OPTIONS -w +) diff --git a/tests/auto/corelib/global/qxp/is_virtual_base_of/tst_is_virtual_base_of.cpp b/tests/auto/corelib/global/qxp/is_virtual_base_of/tst_is_virtual_base_of.cpp new file mode 100644 index 0000000000..e50575f5ec --- /dev/null +++ b/tests/auto/corelib/global/qxp/is_virtual_base_of/tst_is_virtual_base_of.cpp @@ -0,0 +1,102 @@ +// Copyright (C) 2023 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtCore/qxptype_traits.h> + +#include <QTest> + +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<int, int>); +static_assert(!qxp::is_virtual_base_of_v<int, Base>); +static_assert(!qxp::is_virtual_base_of_v<Base, int>); + +// A class isn't a virtual base of itself +static_assert(!qxp::is_virtual_base_of_v<Base, Base>); + +// Non-virtual bases +class NonVirtualDerived : public Base {}; +class NonVirtualPrivateDerived : private Base {}; + +static_assert(!qxp::is_virtual_base_of_v<Base, NonVirtualDerived>); +static_assert(!qxp::is_virtual_base_of_v<Base, NonVirtualPrivateDerived>); + +static_assert(!qxp::is_virtual_base_of_v<NonVirtualPrivateDerived, NonVirtualDerived>); +static_assert(!qxp::is_virtual_base_of_v<NonVirtualDerived, NonVirtualPrivateDerived>); + +static_assert(!qxp::is_virtual_base_of_v<tst_qxp_is_virtual_base_of, QObject>); + +// 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<Base, VirtualDerived1>); +static_assert(qxp::is_virtual_base_of_v<Base, VirtualDerived2>); +static_assert(qxp::is_virtual_base_of_v<Base, VirtualDerived3>); +static_assert(!qxp::is_virtual_base_of_v<VirtualDerived1, VirtualDerived3>); +static_assert(qxp::is_virtual_base_of_v<Base, VirtualDerived4>); +static_assert(qxp::is_virtual_base_of_v<Base, VirtualPrivateDerived>); + +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<Base, AmbiguousBase1>); +#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<Base, AmbiguousBase2>); +#endif +QT_WARNING_POP + +// Const +static_assert(!qxp::is_virtual_base_of_v< Base, const NonVirtualDerived>); +static_assert(!qxp::is_virtual_base_of_v<const Base, NonVirtualDerived>); +static_assert(!qxp::is_virtual_base_of_v<const Base, const NonVirtualDerived>); + +static_assert(!qxp::is_virtual_base_of_v< Base, const NonVirtualPrivateDerived>); +static_assert(!qxp::is_virtual_base_of_v<const Base, NonVirtualPrivateDerived>); +static_assert(!qxp::is_virtual_base_of_v<const Base, const NonVirtualPrivateDerived>); + +static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived1>); +static_assert(qxp::is_virtual_base_of_v<const Base, VirtualDerived1>); +static_assert(qxp::is_virtual_base_of_v<const Base, const VirtualDerived1>); + +static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived2>); +static_assert(qxp::is_virtual_base_of_v<const Base, VirtualDerived2>); +static_assert(qxp::is_virtual_base_of_v<const Base, const VirtualDerived2>); + +static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived3>); +static_assert(qxp::is_virtual_base_of_v<const Base, VirtualDerived3>); +static_assert(qxp::is_virtual_base_of_v<const Base, const VirtualDerived3>); + +static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived4>); +static_assert(qxp::is_virtual_base_of_v<const Base, VirtualDerived4>); +static_assert(qxp::is_virtual_base_of_v<const Base, const VirtualDerived4>); + +static_assert(qxp::is_virtual_base_of_v< Base, const VirtualDerived4>); +static_assert(qxp::is_virtual_base_of_v<const Base, VirtualDerived4>); +static_assert(qxp::is_virtual_base_of_v<const Base, const VirtualDerived4>); + +static_assert(qxp::is_virtual_base_of_v< Base, const VirtualPrivateDerived>); +static_assert(qxp::is_virtual_base_of_v<const Base, VirtualPrivateDerived>); +static_assert(qxp::is_virtual_base_of_v<const Base, const VirtualPrivateDerived>); + + +QTEST_APPLESS_MAIN(tst_qxp_is_virtual_base_of); + +#include "tst_is_virtual_base_of.moc" |