File: template-virtual-member-function.cpp

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.8-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,388 kB
  • sloc: cpp: 7,438,767; ansic: 1,393,871; asm: 1,012,926; python: 241,728; f90: 86,635; objc: 75,411; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (173 lines) | stat: -rw-r--r-- 4,477 bytes parent folder | download | duplicates (4)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
// RUN: %check_clang_tidy %s portability-template-virtual-member-function %t
namespace UninstantiatedVirtualMember {
template<typename T>
struct CrossPlatformError {
    virtual ~CrossPlatformError() = default;

    static void used() {}

    // CHECK-MESSAGES: [[#@LINE+1]]:18: warning: unspecified virtual member function instantiation
    virtual void unused() {
        T MSVCError = this;
    };
};

int main() {
    // CHECK-MESSAGES: [[#@LINE+1]]:5: note: template instantiated here
    CrossPlatformError<int>::used();
    return 0;
}
} // namespace UninstantiatedVirtualMember

namespace UninstantiatedVirtualMembers {
template<typename T>
struct CrossPlatformError {
    virtual ~CrossPlatformError() = default;

    static void used() {}

    // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation
    // CHECK-MESSAGES: [[#@LINE+13]]:5: note: template instantiated here
    virtual void unused() {
        T MSVCError = this;
    };

    // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation
    // CHECK-MESSAGES: [[#@LINE+7]]:5: note: template instantiated here
    virtual void unused2() {
        T MSVCError = this;
    };
};

int main() {
    CrossPlatformError<int>::used();
    return 0;
}
} // namespace UninstantiatedVirtualMembers

namespace UninstantiatedVirtualDestructor {
template<typename T>
struct CrossPlatformError {
    // CHECK-MESSAGES: [[#@LINE+2]]:13: warning: unspecified virtual member function instantiation
    // CHECK-MESSAGES: [[#@LINE+9]]:5: note: template instantiated here
    virtual ~CrossPlatformError() {
        T MSVCError = this;
    };

    static void used() {}
};

int main() {
    CrossPlatformError<int>::used();
    return 0;
}
} // namespace UninstantiatedVirtualDestructor

namespace MultipleImplicitInstantiations {
template<typename T>
struct CrossPlatformError {
    virtual ~CrossPlatformError() = default;

    static void used() {}

    // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation
    // CHECK-MESSAGES: [[#@LINE+7]]:5: note: template instantiated here
    virtual void unused() {
        T MSVCError = this;
    };
};

int main() {
    CrossPlatformError<int>::used();
    CrossPlatformError<float>::used();
    CrossPlatformError<long>::used();
    return 0;
}
} // namespace MultipleImplicitInstantiations

namespace SomeImplicitInstantiationError {
template <typename T> struct CrossPlatformError {
    virtual ~CrossPlatformError() = default;

    static void used() {}

    // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation
    // CHECK-MESSAGES: [[#@LINE+5]]:5: note: template instantiated here
    virtual void unused(){};
};

int main() {
    CrossPlatformError<int>::used();
    CrossPlatformError<float> NoError;
    return 0;
}
} // namespace SomeImplicitInstantiationError

namespace InstantiatedVirtualMemberFunctions {
template<typename T>
struct NoError {
    virtual ~NoError() {};
    virtual void unused() {};
    virtual void unused2() {};
    virtual void unused3() {};
};

int main() {
    NoError<int> Ne;
    return 0;
}
} // namespace InstantiatedVirtualMemberFunctions

namespace UninstantiatedNonVirtualMemberFunctions {
template<typename T>
struct NoError {
    static void used() {};
    void unused() {};
    void unused2() {};
    void unused3() {};
};

int main() {
    NoError<int>::used();
    return 0;
}
} // namespace UninstantiatedNonVirtualMemberFunctions

namespace PartialSpecializationError {
template<typename T, typename U>
struct CrossPlatformError {};

template<typename U>
struct CrossPlatformError<int, U>{
    virtual ~CrossPlatformError() = default;

    static void used() {}

    // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation
    // CHECK-MESSAGES: [[#@LINE+7]]:5: note: template instantiated here
    virtual void unused() {
        U MSVCError = this;
    };
};

int main() {
    CrossPlatformError<int, float>::used();
    return 0;
}
} // namespace PartialSpecializationError

namespace PartialSpecializationNoInstantiation {
template<typename T, typename U>
struct NoInstantiation {};

template<typename U>
struct NoInstantiation<int, U>{
    virtual ~NoInstantiation() = default;

    static void used() {}

    virtual void unused() {
        U MSVCError = this;
    };
};
} // namespace PartialSpecializationNoInstantiation