summaryrefslogtreecommitdiff
path: root/bindgen-tests/tests/headers/canonical-types.hpp
blob: c8eadd7e5e8bcd366d65b74e93c55aac5a3f071f (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
// bindgen-flags: -- -std=c++14

// Issue #2078. To pick up the definition of `ClassCInnerA`,
// `ty.canonical_type().declaration().definition()` is needed.

template<class T>
class ClassA {
public:
    class ClassAInner {
    public:
        T *x;
    };
};

template<class D, class I>
class ClassB {
public:
    void foo() {
        ((D *)0)->quux();
    }
};

template<typename T>
class ClassC {
    struct ClassCInnerA;

    struct ClassCInnerB {
        ClassCInnerA *cache;
    };
    static_assert(sizeof(ClassCInnerB) > 0, "");

    struct ClassCInnerA {
        ClassCInnerB *member;
    };

public:
    class ClassCInnerCRTP : public ClassB<ClassCInnerCRTP, typename ClassA<ClassCInnerA>::ClassAInner> {
    public:
        void quux() {
            ((typename ClassA<ClassCInnerA>::ClassAInner *)0)->x->member;
        }
    };
};

class ClassD : public ClassB<ClassD, ClassC<int>::ClassCInnerCRTP> {
public:
    void bar() {
        ((ClassC<int>::ClassCInnerCRTP *)0)->foo();
    }
};