diff options
author | Anders Carlsson <andersca@mac.com> | 2011-05-14 23:26:09 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-05-14 23:26:09 +0000 |
commit | ffb945ffb5d29b80fd93649c3572b6d87abce3fc (patch) | |
tree | b2f9cf40b3b751972661f2b3763cbabc636c7fb0 /lib/AST/Decl.cpp | |
parent | a83c17c28f4a570e18678f6031834487534f120d (diff) |
When emitting the destructor for a class with a vtable, if we can determine
that the destructor body is trivial and that all member variables also have either
trivial destructors or trivial destructor bodies, we don't need to initialize the
vtable pointers since no virtual member functions will be called on the destructor.
Fixes PR9181.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131368 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index b57c6ab7d7..d4df017383 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1422,6 +1422,20 @@ bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const { return false; } +bool FunctionDecl::hasTrivialBody() const +{ + Stmt *S = getBody(); + if (!S) { + // Since we don't have a body for this function, we don't know if it's + // trivial or not. + return false; + } + + if (isa<CompoundStmt>(S) && cast<CompoundStmt>(S)->body_empty()) + return true; + return false; +} + bool FunctionDecl::isDefined(const FunctionDecl *&Definition) const { for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { if (I->IsDeleted || I->Body || I->IsLateTemplateParsed) { |