diff options
Diffstat (limited to 'lib/AST/DeclCXX.cpp')
| -rw-r--r-- | lib/AST/DeclCXX.cpp | 22 | 
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 8dc62dd07f2c..b00b8a0ea9cc 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -1315,6 +1315,28 @@ CXXDestructorDecl *CXXRecordDecl::getDestructor() const {    return Dtor;  } +bool CXXRecordDecl::isAnyDestructorNoReturn() const { +  // Destructor is noreturn. +  if (const CXXDestructorDecl *Destructor = getDestructor()) +    if (Destructor->isNoReturn()) +      return true; + +  // Check base classes destructor for noreturn. +  for (const auto &Base : bases()) +    if (Base.getType()->getAsCXXRecordDecl()->isAnyDestructorNoReturn()) +      return true; + +  // Check fields for noreturn. +  for (const auto *Field : fields()) +    if (const CXXRecordDecl *RD = +            Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl()) +      if (RD->isAnyDestructorNoReturn()) +        return true; + +  // All destructors are not noreturn. +  return false; +} +  void CXXRecordDecl::completeDefinition() {    completeDefinition(nullptr);  }  | 
