From: Bruno Ricci Date: Sun, 21 Apr 2019 13:12:10 +0000 (+0000) Subject: [Sema][MSVC] Fix bogus microsoft-pure-definition warning on member function of class... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b56b8f9df9d7fe4ee69f56fc4726910a4a72b04;p=clang [Sema][MSVC] Fix bogus microsoft-pure-definition warning on member function of class template Clang emits a warning when using a pure specifier =0 in a function definition at class scope (a MS-specific construct), when using -fms-extensions. However, to detect this, it was using FD->isCanonicalDecl() on function declaration, which was also detecting out-of-class definition of member functions of class templates. Fix this by using !FD->isOutOfLine() instead. Fixes PR21334. Differential Revision: https://reviews.llvm.org/D29707 Reviewed By: riccibruno Reviewers: rnk, riccibruno Patch By: Rudy Pons git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358849 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 1c332674d2..b6ddd86039 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -13244,7 +13244,7 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, // 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()) { diff --git a/test/Parser/MicrosoftExtensions.cpp b/test/Parser/MicrosoftExtensions.cpp index 8799f49df6..63e8b60823 100644 --- a/test/Parser/MicrosoftExtensions.cpp +++ b/test/Parser/MicrosoftExtensions.cpp @@ -288,6 +288,18 @@ struct pure_virtual_dtor_inline { 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@-1 2{{function definition with pure-specifier is a Microsoft extension}} +}; +template struct pure_virtual_dtor_template_inline; +// expected-note@-1 {{in instantiation of member function}} int main () { // Necessary to force instantiation in -fdelayed-template-parsing mode.