diff options
Diffstat (limited to 'lib/Sema/SemaCast.cpp')
-rw-r--r-- | lib/Sema/SemaCast.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp index 1dbc9aaca5..0e19adfd28 100644 --- a/lib/Sema/SemaCast.cpp +++ b/lib/Sema/SemaCast.cpp @@ -695,14 +695,15 @@ static void DiagnoseReinterpretUpDownCast(Sema &Self, const Expr *SrcExpr, const CXXRecordDecl *SrcRD = SrcPointeeRD ? SrcPointeeRD : SrcType->getAsCXXRecordDecl(); - // Examining subobjects for records is only possible if the complete - // definition is available. Also, template instantiation is not allowed here. - if(!SrcRD || !SrcRD->isCompleteDefinition()) + // Examining subobjects for records is only possible if the complete and + // valid definition is available. Also, template instantiation is not + // allowed here. + if (!SrcRD || !SrcRD->isCompleteDefinition() || SrcRD->isInvalidDecl()) return; const CXXRecordDecl *DestRD = DestType->getPointeeCXXRecordDecl(); - if(!DestRD || !DestRD->isCompleteDefinition()) + if (!DestRD || !DestRD->isCompleteDefinition() || DestRD->isInvalidDecl()) return; enum { @@ -721,7 +722,7 @@ static void DiagnoseReinterpretUpDownCast(Sema &Self, const Expr *SrcExpr, bool VirtualBase = true; bool NonZeroOffset = false; - for (CXXBasePaths::const_paths_iterator I = BasePaths.begin(), + for (CXXBasePaths::const_paths_iterator I = BasePaths.begin(), E = BasePaths.end(); I != E; ++I) { const CXXBasePath &Path = *I; @@ -734,8 +735,16 @@ static void DiagnoseReinterpretUpDownCast(Sema &Self, const Expr *SrcExpr, break; const CXXRecordDecl *BaseRD = IElem->Base->getType()->getAsCXXRecordDecl(); assert(BaseRD && "Base type should be a valid unqualified class type"); + // Don't check if any base has invalid declaration or has no definition + // since it has no layout info. + const CXXRecordDecl *Class = IElem->Class, + *ClassDefinition = Class->getDefinition(); + if (Class->isInvalidDecl() || !ClassDefinition || + !ClassDefinition->isCompleteDefinition()) + return; + const ASTRecordLayout &DerivedLayout = - Self.Context.getASTRecordLayout(IElem->Class); + Self.Context.getASTRecordLayout(Class); Offset += DerivedLayout.getBaseClassOffset(BaseRD); } if (!IsVirtual) { |