Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -12025,7 +12025,7 @@ // MSVC permits the use of pure specifier (=0) on function definition, // defined at class scope, warn about this non-standard construct. - if (getLangOpts().MicrosoftExt && FD->isPure() && FD->isCanonicalDecl()) + if (getLangOpts().MicrosoftExt && FD->isPure() && !FD->isOutOfLine()) Diag(FD->getLocation(), diag::ext_pure_function_definition); if (!FD->isInvalidDecl()) { Index: test/Parser/MicrosoftExtensions.cpp =================================================================== --- test/Parser/MicrosoftExtensions.cpp +++ test/Parser/MicrosoftExtensions.cpp @@ -290,6 +290,17 @@ virtual ~pure_virtual_dtor_inline() = 0 { }// expected-warning {{function definition with pure-specifier is a Microsoft extension}} }; +template struct pure_virtual_dtor_template { + virtual ~pure_virtual_dtor_template() = 0; +}; +template pure_virtual_dtor_template::~pure_virtual_dtor_template() { } +template struct pure_virtual_dtor_template; + +template struct pure_virtual_dtor_template_inline { + virtual ~pure_virtual_dtor_template_inline() = 0 { }// expected-warning {{function definition with pure-specifier is a Microsoft extension}} expected-warning {{function definition with pure-specifier is a Microsoft extension}} +}; +template struct pure_virtual_dtor_template_inline;// expected-note {{in instantiation of member function}} + int main () { // Necessary to force instantiation in -fdelayed-template-parsing mode.