diff options
Diffstat (limited to 'lib/AST/DeclCXX.cpp')
| -rw-r--r-- | lib/AST/DeclCXX.cpp | 39 | 
1 files changed, 22 insertions, 17 deletions
| diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 457f4c85a047..b4c0c59733e5 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -189,7 +189,10 @@ bool CXXRecordDecl::hasConstCopyAssignment(ASTContext &Context,      //   A user-declared copy assignment operator is a non-static non-template      //   member function of class X with exactly one parameter of type X, X&,      //   const X&, volatile X& or const volatile X&. -    const CXXMethodDecl* Method = cast<CXXMethodDecl>(*Op); +    const CXXMethodDecl* Method = dyn_cast<CXXMethodDecl>(*Op); +    if (!Method) +      continue; +      if (Method->isStatic())        continue;      if (Method->getPrimaryTemplate()) @@ -364,34 +367,36 @@ CXXRecordDecl::getNestedVisibleConversionFunctions(CXXRecordDecl *RD,        }      }    } -   +    if (getNumBases() == 0 && getNumVBases() == 0)      return; -   +    llvm::SmallPtrSet<CanQualType, 8> ConversionFunctions;    if (!inTopClass)      collectConversionFunctions(ConversionFunctions); -   +    for (CXXRecordDecl::base_class_iterator VBase = vbases_begin(),         E = vbases_end(); VBase != E; ++VBase) { -    CXXRecordDecl *VBaseClassDecl -      = cast<CXXRecordDecl>(VBase->getType()->getAs<RecordType>()->getDecl()); -    VBaseClassDecl->getNestedVisibleConversionFunctions(RD, -                  TopConversionsTypeSet, -                  (inTopClass ? TopConversionsTypeSet : ConversionFunctions)); -       +    if (const RecordType *RT = VBase->getType()->getAs<RecordType>()) { +      CXXRecordDecl *VBaseClassDecl +        = cast<CXXRecordDecl>(RT->getDecl()); +      VBaseClassDecl->getNestedVisibleConversionFunctions(RD, +                    TopConversionsTypeSet, +                    (inTopClass ? TopConversionsTypeSet : ConversionFunctions)); +    }    }    for (CXXRecordDecl::base_class_iterator Base = bases_begin(),         E = bases_end(); Base != E; ++Base) {      if (Base->isVirtual())        continue; -    CXXRecordDecl *BaseClassDecl -      = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); -     -    BaseClassDecl->getNestedVisibleConversionFunctions(RD, -                  TopConversionsTypeSet, -                  (inTopClass ? TopConversionsTypeSet : ConversionFunctions)); -     +    if (const RecordType *RT = Base->getType()->getAs<RecordType>()) { +      CXXRecordDecl *BaseClassDecl +        = cast<CXXRecordDecl>(RT->getDecl()); + +      BaseClassDecl->getNestedVisibleConversionFunctions(RD, +                    TopConversionsTypeSet, +                    (inTopClass ? TopConversionsTypeSet : ConversionFunctions)); +    }    }  } | 
