summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/global/qxp/is_virtual_base_of/tst_is_virtual_base_of.cpp
blob: e50575f5eca454c8c1531c7c07915a12072a32fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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"