diff options
Diffstat (limited to 'clang/lib/CodeGen/CGExprCXX.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 57d7eecc62ee..a092b718412b 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -180,8 +180,7 @@ static CXXRecordDecl *getCXXRecord(const Expr *E) { QualType T = E->getType(); if (const PointerType *PTy = T->getAs<PointerType>()) T = PTy->getPointeeType(); - const RecordType *Ty = T->castAs<RecordType>(); - return cast<CXXRecordDecl>(Ty->getOriginalDecl())->getDefinitionOrSelf(); + return T->castAsCXXRecordDecl(); } // Note: This function also emit constructor calls to support a MSVC @@ -1235,9 +1234,10 @@ void CodeGenFunction::EmitNewArrayInitializer( // If we have a struct whose every field is value-initialized, we can // usually use memset. if (auto *ILE = dyn_cast<InitListExpr>(Init)) { - if (const RecordType *RType = ILE->getType()->getAs<RecordType>()) { - const RecordDecl *RD = RType->getOriginalDecl()->getDefinitionOrSelf(); - if (RD->isStruct()) { + if (const RecordType *RType = + ILE->getType()->getAsCanonical<RecordType>()) { + if (RType->getOriginalDecl()->isStruct()) { + const RecordDecl *RD = RType->getOriginalDecl()->getDefinitionOrSelf(); unsigned NumElements = 0; if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) NumElements = CXXRD->getNumBases(); @@ -1687,11 +1687,8 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) { QualType AlignValT = sizeType; if (allocatorType->getNumParams() > IndexOfAlignArg) { AlignValT = allocatorType->getParamType(IndexOfAlignArg); - assert(getContext().hasSameUnqualifiedType(AlignValT->castAs<EnumType>() - ->getOriginalDecl() - ->getDefinitionOrSelf() - ->getIntegerType(), - sizeType) && + assert(getContext().hasSameUnqualifiedType( + AlignValT->castAsEnumDecl()->getIntegerType(), sizeType) && "wrong type for alignment parameter"); ++ParamsToSkip; } else { @@ -1973,9 +1970,7 @@ static bool EmitObjectDelete(CodeGenFunction &CGF, // Find the destructor for the type, if applicable. If the // destructor is virtual, we'll just emit the vcall and return. const CXXDestructorDecl *Dtor = nullptr; - if (const RecordType *RT = ElementType->getAs<RecordType>()) { - auto *RD = - cast<CXXRecordDecl>(RT->getOriginalDecl())->getDefinitionOrSelf(); + if (const auto *RD = ElementType->getAsCXXRecordDecl()) { if (RD->hasDefinition() && !RD->hasTrivialDestructor()) { Dtor = RD->getDestructor(); @@ -2295,8 +2290,7 @@ llvm::Value *CodeGenFunction::EmitDynamicCast(Address ThisAddr, bool IsExact = !IsDynamicCastToVoid && CGM.getCodeGenOpts().OptimizationLevel > 0 && DestRecordTy->getAsCXXRecordDecl()->isEffectivelyFinal() && - CGM.getCXXABI().shouldEmitExactDynamicCast(DestRecordTy) && - !getLangOpts().PointerAuthCalls; + CGM.getCXXABI().shouldEmitExactDynamicCast(DestRecordTy); std::optional<CGCXXABI::ExactDynamicCastInfo> ExactCastInfo; if (IsExact) { |
