191 lines · cpp
1// RUN: %check_clang_tidy %s portability-template-virtual-member-function %t2namespace UninstantiatedVirtualMember {3template<typename T>4struct CrossPlatformError {5 virtual ~CrossPlatformError() = default;6 7 static void used() {}8 9 // CHECK-MESSAGES: [[#@LINE+1]]:18: warning: unspecified virtual member function instantiation10 virtual void unused() {11 T MSVCError = this;12 };13};14 15int main() {16 // CHECK-MESSAGES: [[#@LINE+1]]:5: note: template instantiated here17 CrossPlatformError<int>::used();18 return 0;19}20} // namespace UninstantiatedVirtualMember21 22namespace UninstantiatedVirtualMembers {23template<typename T>24struct CrossPlatformError {25 virtual ~CrossPlatformError() = default;26 27 static void used() {}28 29 // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation30 // CHECK-MESSAGES: [[#@LINE+13]]:5: note: template instantiated here31 virtual void unused() {32 T MSVCError = this;33 };34 35 // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation36 // CHECK-MESSAGES: [[#@LINE+7]]:5: note: template instantiated here37 virtual void unused2() {38 T MSVCError = this;39 };40};41 42int main() {43 CrossPlatformError<int>::used();44 return 0;45}46} // namespace UninstantiatedVirtualMembers47 48namespace UninstantiatedVirtualDestructor {49template<typename T>50struct CrossPlatformError {51 // CHECK-MESSAGES: [[#@LINE+2]]:13: warning: unspecified virtual member function instantiation52 // CHECK-MESSAGES: [[#@LINE+9]]:5: note: template instantiated here53 virtual ~CrossPlatformError() {54 T MSVCError = this;55 };56 57 static void used() {}58};59 60int main() {61 CrossPlatformError<int>::used();62 return 0;63}64} // namespace UninstantiatedVirtualDestructor65 66namespace MultipleImplicitInstantiations {67template<typename T>68struct CrossPlatformError {69 virtual ~CrossPlatformError() = default;70 71 static void used() {}72 73 // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation74 // CHECK-MESSAGES: [[#@LINE+7]]:5: note: template instantiated here75 virtual void unused() {76 T MSVCError = this;77 };78};79 80int main() {81 CrossPlatformError<int>::used();82 CrossPlatformError<float>::used();83 CrossPlatformError<long>::used();84 return 0;85}86} // namespace MultipleImplicitInstantiations87 88namespace SomeImplicitInstantiationError {89template <typename T> struct CrossPlatformError {90 virtual ~CrossPlatformError() = default;91 92 static void used() {}93 94 // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation95 // CHECK-MESSAGES: [[#@LINE+5]]:5: note: template instantiated here96 virtual void unused(){};97};98 99int main() {100 CrossPlatformError<int>::used();101 CrossPlatformError<float> NoError;102 return 0;103}104} // namespace SomeImplicitInstantiationError105 106namespace InstantiatedVirtualMemberFunctions {107template<typename T>108struct NoError {109 virtual ~NoError() {};110 virtual void unused() {};111 virtual void unused2() {};112 virtual void unused3() {};113};114 115int main() {116 NoError<int> Ne;117 return 0;118}119} // namespace InstantiatedVirtualMemberFunctions120 121namespace UninstantiatedNonVirtualMemberFunctions {122template<typename T>123struct NoError {124 static void used() {};125 void unused() {};126 void unused2() {};127 void unused3() {};128};129 130int main() {131 NoError<int>::used();132 return 0;133}134} // namespace UninstantiatedNonVirtualMemberFunctions135 136namespace PartialSpecializationError {137template<typename T, typename U>138struct CrossPlatformError {};139 140template<typename U>141struct CrossPlatformError<int, U>{142 virtual ~CrossPlatformError() = default;143 144 static void used() {}145 146 // CHECK-MESSAGES: [[#@LINE+2]]:18: warning: unspecified virtual member function instantiation147 // CHECK-MESSAGES: [[#@LINE+7]]:5: note: template instantiated here148 virtual void unused() {149 U MSVCError = this;150 };151};152 153int main() {154 CrossPlatformError<int, float>::used();155 return 0;156}157} // namespace PartialSpecializationError158 159namespace PartialSpecializationNoInstantiation {160template<typename T, typename U>161struct NoInstantiation {};162 163template<typename U>164struct NoInstantiation<int, U>{165 virtual ~NoInstantiation() = default;166 167 static void used() {}168 169 virtual void unused() {170 U MSVCError = this;171 };172};173} // namespace PartialSpecializationNoInstantiation174 175namespace PureVirtual {176 177template<typename T>178struct Base {179 virtual void foo() = 0;180};181 182struct Derived : public Base<int> {183 void foo() {}184};185 186void test() {187 Derived{}.foo();188}189 190}191