https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93503
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- For the reduced testcase this is what clang produces: <source>:3:5: error: 'virtual' cannot be specified on member function templates virtual int foo(int) = 0; ^~~~~~~~ <source>:3:17: error: illegal initializer (only variables can be initialized) virtual int foo(int) = 0; ^ MSVC: <source>(3): error C2898: 'int S::foo(int)': member function templates cannot be virtual <source>(3): error C2187: syntax error: 'constant' was unexpected here <source>(3): note: This diagnostic occurred in the compiler generated function 'int S::foo(int)' ICC: <source>(3): error: "virtual" is not allowed in a function template declaration virtual int foo(int) = 0; ^ <source>(3): error: expected a ";" virtual int foo(int) = 0; ^ Clang's error message is incorrect even because it says only variables can be initialized which is not true as virtual functions can be initilized to 0 so it can be considered a pure virtual. Maybe GCC's second error message could be changed to talk about pure virtual and such.