@@ -180,7 +180,11 @@ CharUnits CodeGenModule::computeNonVirtualBaseClassOffset(
180180 // Get the layout.
181181 const ASTRecordLayout &Layout = Context.getASTRecordLayout (RD);
182182
183- const auto *BaseDecl = Base->getType ()->castAsCXXRecordDecl ();
183+ const auto *BaseDecl =
184+ cast<CXXRecordDecl>(
185+ Base->getType ()->castAs <RecordType>()->getOriginalDecl ())
186+ ->getDefinitionOrSelf ();
187+
184188 // Add the offset.
185189 Offset += Layout.getBaseClassOffset (BaseDecl);
186190
@@ -298,7 +302,9 @@ Address CodeGenFunction::GetAddressOfBaseClass(
298302 // *start* with a step down to the correct virtual base subobject,
299303 // and hence will not require any further steps.
300304 if ((*Start)->isVirtual ()) {
301- VBase = (*Start)->getType ()->castAsCXXRecordDecl ();
305+ VBase = cast<CXXRecordDecl>(
306+ (*Start)->getType ()->castAs <RecordType>()->getOriginalDecl ())
307+ ->getDefinitionOrSelf ();
302308 ++Start;
303309 }
304310
@@ -553,7 +559,10 @@ static void EmitBaseInitializer(CodeGenFunction &CGF,
553559
554560 Address ThisPtr = CGF.LoadCXXThisAddress ();
555561
556- const auto *BaseClassDecl = BaseInit->getBaseClass ()->castAsCXXRecordDecl ();
562+ const Type *BaseType = BaseInit->getBaseClass ();
563+ const auto *BaseClassDecl =
564+ cast<CXXRecordDecl>(BaseType->castAs <RecordType>()->getOriginalDecl ())
565+ ->getDefinitionOrSelf ();
557566
558567 bool isBaseVirtual = BaseInit->isBaseVirtual ();
559568
@@ -1258,7 +1267,10 @@ namespace {
12581267
12591268static bool isInitializerOfDynamicClass (const CXXCtorInitializer *BaseInit) {
12601269 const Type *BaseType = BaseInit->getBaseClass ();
1261- return BaseType->castAsCXXRecordDecl ()->isDynamicClass ();
1270+ const auto *BaseClassDecl =
1271+ cast<CXXRecordDecl>(BaseType->castAs <RecordType>()->getOriginalDecl ())
1272+ ->getDefinitionOrSelf ();
1273+ return BaseClassDecl->isDynamicClass ();
12621274}
12631275
12641276// / EmitCtorPrologue - This routine generates necessary code to initialize
@@ -1365,7 +1377,10 @@ HasTrivialDestructorBody(ASTContext &Context,
13651377 if (I.isVirtual ())
13661378 continue ;
13671379
1368- const auto *NonVirtualBase = I.getType ()->castAsCXXRecordDecl ();
1380+ const CXXRecordDecl *NonVirtualBase =
1381+ cast<CXXRecordDecl>(
1382+ I.getType ()->castAs <RecordType>()->getOriginalDecl ())
1383+ ->getDefinitionOrSelf ();
13691384 if (!HasTrivialDestructorBody (Context, NonVirtualBase,
13701385 MostDerivedClassDecl))
13711386 return false ;
@@ -1374,7 +1389,10 @@ HasTrivialDestructorBody(ASTContext &Context,
13741389 if (BaseClassDecl == MostDerivedClassDecl) {
13751390 // Check virtual bases.
13761391 for (const auto &I : BaseClassDecl->vbases ()) {
1377- const auto *VirtualBase = I.getType ()->castAsCXXRecordDecl ();
1392+ const auto *VirtualBase =
1393+ cast<CXXRecordDecl>(
1394+ I.getType ()->castAs <RecordType>()->getOriginalDecl ())
1395+ ->getDefinitionOrSelf ();
13781396 if (!HasTrivialDestructorBody (Context, VirtualBase,
13791397 MostDerivedClassDecl))
13801398 return false ;
@@ -1390,10 +1408,13 @@ FieldHasTrivialDestructorBody(ASTContext &Context,
13901408{
13911409 QualType FieldBaseElementType = Context.getBaseElementType (Field->getType ());
13921410
1393- auto *FieldClassDecl = FieldBaseElementType->getAsCXXRecordDecl ();
1394- if (!FieldClassDecl )
1411+ const RecordType *RT = FieldBaseElementType->getAs <RecordType> ();
1412+ if (!RT )
13951413 return true ;
13961414
1415+ auto *FieldClassDecl =
1416+ cast<CXXRecordDecl>(RT->getOriginalDecl ())->getDefinitionOrSelf ();
1417+
13971418 // The destructor for an implicit anonymous union member is never invoked.
13981419 if (FieldClassDecl->isUnion () && FieldClassDecl->isAnonymousStructOrUnion ())
13991420 return true ;
@@ -1886,7 +1907,11 @@ void CodeGenFunction::EnterDtorCleanups(const CXXDestructorDecl *DD,
18861907 // We push them in the forward order so that they'll be popped in
18871908 // the reverse order.
18881909 for (const auto &Base : ClassDecl->vbases ()) {
1889- auto *BaseClassDecl = Base.getType ()->castAsCXXRecordDecl ();
1910+ auto *BaseClassDecl =
1911+ cast<CXXRecordDecl>(
1912+ Base.getType ()->castAs <RecordType>()->getOriginalDecl ())
1913+ ->getDefinitionOrSelf ();
1914+
18901915 if (BaseClassDecl->hasTrivialDestructor ()) {
18911916 // Under SanitizeMemoryUseAfterDtor, poison the trivial base class
18921917 // memory. For non-trival base classes the same is done in the class
@@ -2105,7 +2130,10 @@ void CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *ctor,
21052130void CodeGenFunction::destroyCXXObject (CodeGenFunction &CGF,
21062131 Address addr,
21072132 QualType type) {
2108- const CXXDestructorDecl *dtor = type->castAsCXXRecordDecl ()->getDestructor ();
2133+ const RecordType *rtype = type->castAs <RecordType>();
2134+ const auto *record =
2135+ cast<CXXRecordDecl>(rtype->getOriginalDecl ())->getDefinitionOrSelf ();
2136+ const CXXDestructorDecl *dtor = record->getDestructor ();
21092137 assert (!dtor->isTrivial ());
21102138 CGF.EmitCXXDestructorCall (dtor, Dtor_Complete, /* for vbase*/ false ,
21112139 /* Delegating=*/ false , addr, type);
@@ -2624,7 +2652,10 @@ void CodeGenFunction::getVTablePointers(BaseSubobject Base,
26242652
26252653 // Traverse bases.
26262654 for (const auto &I : RD->bases ()) {
2627- auto *BaseDecl = I.getType ()->castAsCXXRecordDecl ();
2655+ auto *BaseDecl = cast<CXXRecordDecl>(
2656+ I.getType ()->castAs <RecordType>()->getOriginalDecl ())
2657+ ->getDefinitionOrSelf ();
2658+
26282659 // Ignore classes without a vtable.
26292660 if (!BaseDecl->isDynamicClass ())
26302661 continue ;
@@ -2819,10 +2850,13 @@ void CodeGenFunction::EmitVTablePtrCheckForCast(QualType T, Address Derived,
28192850 if (!getLangOpts ().CPlusPlus )
28202851 return ;
28212852
2822- const auto *ClassDecl = T->getAsCXXRecordDecl ();
2823- if (!ClassDecl )
2853+ auto *ClassTy = T->getAs <RecordType> ();
2854+ if (!ClassTy )
28242855 return ;
28252856
2857+ const auto *ClassDecl =
2858+ cast<CXXRecordDecl>(ClassTy->getOriginalDecl ())->getDefinitionOrSelf ();
2859+
28262860 if (!ClassDecl->isCompleteDefinition () || !ClassDecl->isDynamicClass ())
28272861 return ;
28282862
0 commit comments