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