diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 3 | 
3 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index f4041553507..f2f0694826c 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -609,7 +609,8 @@ CXXDestructorDecl *CXXRecordDecl::getDestructor() const {    DeclContext::lookup_const_iterator I, E;    llvm::tie(I, E) = lookup(Name); -  assert(I != E && "Did not find a destructor!"); +  if (I == E) +    return 0;    CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(*I);    assert(++I == E && "Found more than one destructor!"); diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index ae57f4cd673..0a101300d8f 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -488,6 +488,16 @@ bool UnaryTypeTraitExpr::EvaluateTrait(ASTContext& C) const {        }      }      return false; +  case UTT_HasVirtualDestructor: +    // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html: +    //   If type is a class type with a virtual destructor ([class.dtor]) +    //   then the trait is true, else it is false. +    if (const RecordType *Record = QueriedType->getAs<RecordType>()) { +      CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl()); +      if (CXXDestructorDecl *Destructor = RD->getDestructor()) +        return Destructor->isVirtual(); +    } +    return false;    }  } diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index f1abd59421e..c4beab191d3 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -533,7 +533,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,  ///                   '__has_trivial_copy'                    [TODO]  ///                   '__has_trivial_constructor'  ///                   '__has_trivial_destructor' -///                   '__has_virtual_destructor'              [TODO] +///                   '__has_virtual_destructor'  ///                   '__is_abstract'                         [TODO]  ///                   '__is_class'  ///                   '__is_empty'                            [TODO] @@ -903,6 +903,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,    case tok::kw___has_nothrow_assign:    case tok::kw___has_nothrow_copy:    case tok::kw___has_nothrow_constructor: +  case tok::kw___has_virtual_destructor:      return ParseUnaryTypeTrait();    case tok::at: {  | 

