forked from OSchip/llvm-project
-Wmicrosoft: Don't warn on non-inline pure virtual method definitions
MSVC and clang with -fms-extensions allow pure virtual methods to be defined inline after the "= 0" tokens. Clang warns on these because it is not standard, but incorrectly warns on out-of-line definitions, which are standard. With this change, clang will only warn on inline definitions of pure virtual methods. Fixes some self-host warnings on out-of-line definitions of pure virtual destructors. llvm-svn: 192244
This commit is contained in:
parent
0a903478c6
commit
be7a446637
|
@ -9633,7 +9633,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())
|
||||
if (getLangOpts().MicrosoftExt && FD->isPure() && FD->isCanonicalDecl())
|
||||
Diag(FD->getLocation(), diag::warn_pure_function_definition);
|
||||
|
||||
if (!FD->isInvalidDecl()) {
|
||||
|
|
|
@ -331,6 +331,15 @@ class inline_definition_pure_spec {
|
|||
virtual int f2() = 0;
|
||||
};
|
||||
|
||||
struct pure_virtual_dtor {
|
||||
virtual ~pure_virtual_dtor() = 0;
|
||||
};
|
||||
pure_virtual_dtor::~pure_virtual_dtor() { }
|
||||
|
||||
struct pure_virtual_dtor_inline {
|
||||
virtual ~pure_virtual_dtor_inline() = 0 { }// expected-warning {{function definition with pure-specifier is a Microsoft extension}}
|
||||
};
|
||||
|
||||
|
||||
int main () {
|
||||
// Necessary to force instantiation in -fdelayed-template-parsing mode.
|
||||
|
|
Loading…
Reference in New Issue