1*6d8e9665Sisuckatcs.. title:: clang-tidy - portability-template-virtual-member-function 2*6d8e9665Sisuckatcs 3*6d8e9665Sisuckatcsportability-template-virtual-member-function 4*6d8e9665Sisuckatcs============================================ 5*6d8e9665Sisuckatcs 6*6d8e9665SisuckatcsFinds cases when an uninstantiated virtual member function in a template class causes 7*6d8e9665Sisuckatcscross-compiler incompatibility. 8*6d8e9665Sisuckatcs 9*6d8e9665SisuckatcsUpon instantiating a template class, non-virtual member functions don't have to be 10*6d8e9665Sisuckatcsinstantiated unless they are used. Virtual member function instantiation on the other hand 11*6d8e9665Sisuckatcsis unspecified and depends on the implementation of the compiler. 12*6d8e9665Sisuckatcs 13*6d8e9665SisuckatcsIn the following snippets the virtual member function is not instantiated by GCC and Clang, 14*6d8e9665Sisuckatcsbut it is instantiated by MSVC, so while the snippet is accepted by the former compilers, 15*6d8e9665Sisuckatcsit is rejected by the latter. 16*6d8e9665Sisuckatcs 17*6d8e9665Sisuckatcs.. code:: c++ 18*6d8e9665Sisuckatcs 19*6d8e9665Sisuckatcs template<typename T> 20*6d8e9665Sisuckatcs struct CrossPlatformError { 21*6d8e9665Sisuckatcs virtual ~CrossPlatformError() = default; 22*6d8e9665Sisuckatcs 23*6d8e9665Sisuckatcs static void used() {} 24*6d8e9665Sisuckatcs 25*6d8e9665Sisuckatcs virtual void unused() { 26*6d8e9665Sisuckatcs T MSVCError = this; 27*6d8e9665Sisuckatcs }; 28*6d8e9665Sisuckatcs }; 29*6d8e9665Sisuckatcs 30*6d8e9665Sisuckatcs int main() { 31*6d8e9665Sisuckatcs CrossPlatformError<int>::used(); 32*6d8e9665Sisuckatcs return 0; 33*6d8e9665Sisuckatcs } 34*6d8e9665Sisuckatcs 35*6d8e9665SisuckatcsCross-platform projects that need to support MSVC on Windows might see compiler errors 36*6d8e9665Sisuckatcsbecause certain virtual member functions are instantiated, which are not instantiated 37*6d8e9665Sisuckatcsby other compilers on other platforms. This check highlights such virtual member functions. 38