forked from OSchip/llvm-project
Silence static analyzer getAs<RecordType> null dereference warnings. NFCI.
The static analyzer is warning about potential null dereferences, but in these cases we should be able to use castAs<RecordType> directly and if not assert will fire for us. llvm-svn: 373584
This commit is contained in:
parent
44bc1186e4
commit
1cd399c915
|
@ -652,7 +652,7 @@ void APValue::printPretty(raw_ostream &Out, const ASTContext &Ctx,
|
|||
}
|
||||
case APValue::Struct: {
|
||||
Out << '{';
|
||||
const RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
|
||||
const RecordDecl *RD = Ty->castAs<RecordType>()->getDecl();
|
||||
bool First = true;
|
||||
if (unsigned N = getStructNumBases()) {
|
||||
const CXXRecordDecl *CD = cast<CXXRecordDecl>(RD);
|
||||
|
|
|
@ -218,7 +218,7 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
|
|||
if (BaseType->isDependentType())
|
||||
continue;
|
||||
auto *BaseClassDecl =
|
||||
cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
|
||||
cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl());
|
||||
|
||||
// C++2a [class]p7:
|
||||
// A standard-layout class is a class that:
|
||||
|
@ -1909,7 +1909,7 @@ bool CXXRecordDecl::mayBeAbstract() const {
|
|||
|
||||
for (const auto &B : bases()) {
|
||||
const auto *BaseDecl =
|
||||
cast<CXXRecordDecl>(B.getType()->getAs<RecordType>()->getDecl());
|
||||
cast<CXXRecordDecl>(B.getType()->castAs<RecordType>()->getDecl());
|
||||
if (BaseDecl->isAbstract())
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -85,8 +85,8 @@ const Expr *Expr::skipRValueSubobjectAdjustments(
|
|||
CE->getCastKind() == CK_UncheckedDerivedToBase) &&
|
||||
E->getType()->isRecordType()) {
|
||||
E = CE->getSubExpr();
|
||||
CXXRecordDecl *Derived
|
||||
= cast<CXXRecordDecl>(E->getType()->getAs<RecordType>()->getDecl());
|
||||
auto *Derived =
|
||||
cast<CXXRecordDecl>(E->getType()->castAs<RecordType>()->getDecl());
|
||||
Adjustments.push_back(SubobjectAdjustment(CE, Derived));
|
||||
continue;
|
||||
}
|
||||
|
@ -3205,7 +3205,7 @@ bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef,
|
|||
|
||||
if (ILE->getType()->isRecordType()) {
|
||||
unsigned ElementNo = 0;
|
||||
RecordDecl *RD = ILE->getType()->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = ILE->getType()->castAs<RecordType>()->getDecl();
|
||||
for (const auto *Field : RD->fields()) {
|
||||
// If this is a union, skip all the fields that aren't being initialized.
|
||||
if (RD->isUnion() && ILE->getInitializedFieldInUnion() != Field)
|
||||
|
|
|
@ -7211,7 +7211,7 @@ public:
|
|||
|
||||
const ValueDecl *MD = E->getMemberDecl();
|
||||
if (const FieldDecl *FD = dyn_cast<FieldDecl>(E->getMemberDecl())) {
|
||||
assert(BaseTy->getAs<RecordType>()->getDecl()->getCanonicalDecl() ==
|
||||
assert(BaseTy->castAs<RecordType>()->getDecl()->getCanonicalDecl() ==
|
||||
FD->getParent()->getCanonicalDecl() && "record / field mismatch");
|
||||
(void)BaseTy;
|
||||
if (!HandleLValueMember(this->Info, E, Result, FD))
|
||||
|
|
|
@ -90,8 +90,8 @@ void InheritanceHierarchyWriter::WriteNode(QualType Type, bool FromVirtual) {
|
|||
Out << " \"];\n";
|
||||
|
||||
// Display the base classes.
|
||||
const CXXRecordDecl *Decl
|
||||
= static_cast<const CXXRecordDecl *>(Type->getAs<RecordType>()->getDecl());
|
||||
const auto *Decl =
|
||||
static_cast<const CXXRecordDecl *>(Type->castAs<RecordType>()->getDecl());
|
||||
for (const auto &Base : Decl->bases()) {
|
||||
QualType CanonBaseType = Context.getCanonicalType(Base.getType());
|
||||
|
||||
|
|
|
@ -238,7 +238,7 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) {
|
|||
if (Spec.isVirtual())
|
||||
continue;
|
||||
|
||||
const RecordDecl *BD = Spec.getType()->getAs<RecordType>()->getDecl();
|
||||
const RecordDecl *BD = Spec.getType()->castAs<RecordType>()->getDecl();
|
||||
Record *BR = getOrCreateRecord(BD);
|
||||
if (Descriptor *Desc = GetBaseDesc(BD, BR)) {
|
||||
Size += align(sizeof(InlineDescriptor));
|
||||
|
@ -250,7 +250,7 @@ Record *Program::getOrCreateRecord(const RecordDecl *RD) {
|
|||
}
|
||||
|
||||
for (const CXXBaseSpecifier &Spec : CD->vbases()) {
|
||||
const RecordDecl *BD = Spec.getType()->getAs<RecordType>()->getDecl();
|
||||
const RecordDecl *BD = Spec.getType()->castAs<RecordType>()->getDecl();
|
||||
Record *BR = getOrCreateRecord(BD);
|
||||
|
||||
if (Descriptor *Desc = GetBaseDesc(BD, BR)) {
|
||||
|
|
|
@ -1324,7 +1324,7 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
|
|||
|
||||
if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
|
||||
// We must have an anonymous union or struct declaration.
|
||||
const RecordDecl *RD = VD->getType()->getAs<RecordType>()->getDecl();
|
||||
const RecordDecl *RD = VD->getType()->castAs<RecordType>()->getDecl();
|
||||
|
||||
// Itanium C++ ABI 5.1.2:
|
||||
//
|
||||
|
|
|
@ -286,7 +286,7 @@ llvm::json::Array JSONNodeDumper::createCastPath(const CastExpr *C) {
|
|||
for (auto I = C->path_begin(), E = C->path_end(); I != E; ++I) {
|
||||
const CXXBaseSpecifier *Base = *I;
|
||||
const auto *RD =
|
||||
cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
|
||||
cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
llvm::json::Object Val{{"name", RD->getName()}};
|
||||
if (Base->isVirtual())
|
||||
|
|
|
@ -636,8 +636,8 @@ static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
|
|||
if (!First)
|
||||
OS << " -> ";
|
||||
|
||||
const CXXRecordDecl *RD =
|
||||
cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *RD =
|
||||
cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
if (Base->isVirtual())
|
||||
OS << "virtual ";
|
||||
|
|
|
@ -64,8 +64,8 @@ void VTTBuilder::LayoutSecondaryVTTs(BaseSubobject Base) {
|
|||
if (I.isVirtual())
|
||||
continue;
|
||||
|
||||
const CXXRecordDecl *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(RD);
|
||||
CharUnits BaseOffset = Base.getBaseOffset() +
|
||||
|
@ -90,8 +90,8 @@ VTTBuilder::LayoutSecondaryVirtualPointers(BaseSubobject Base,
|
|||
return;
|
||||
|
||||
for (const auto &I : RD->bases()) {
|
||||
const CXXRecordDecl *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Itanium C++ ABI 2.6.2:
|
||||
// Secondary virtual pointers are present for all bases with either
|
||||
|
@ -154,8 +154,8 @@ VTTBuilder::LayoutSecondaryVirtualPointers(BaseSubobject Base,
|
|||
void VTTBuilder::LayoutVirtualVTTs(const CXXRecordDecl *RD,
|
||||
VisitedVirtualBasesSetTy &VBases) {
|
||||
for (const auto &I : RD->bases()) {
|
||||
const CXXRecordDecl *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Check if this is a virtual base.
|
||||
if (I.isVirtual()) {
|
||||
|
|
|
@ -80,7 +80,7 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {
|
|||
|
||||
// Skip base classes with trivial destructors.
|
||||
const auto *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
if (Base->hasTrivialDestructor()) continue;
|
||||
|
||||
// If we've already found a base class with a non-trivial
|
||||
|
|
|
@ -46,8 +46,8 @@ CGCallee CGCXXABI::EmitLoadOfMemberFunctionPointer(
|
|||
ThisPtrForCall = This.getPointer();
|
||||
const FunctionProtoType *FPT =
|
||||
MPT->getPointeeType()->getAs<FunctionProtoType>();
|
||||
const CXXRecordDecl *RD =
|
||||
cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
|
||||
const auto *RD =
|
||||
cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
|
||||
llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(
|
||||
CGM.getTypes().arrangeCXXMethodType(RD, FPT, /*FD=*/nullptr));
|
||||
llvm::Constant *FnPtr = llvm::Constant::getNullValue(FTy->getPointerTo());
|
||||
|
|
|
@ -3092,7 +3092,7 @@ void CodeGenFunction::EmitDelegateCallArg(CallArgList &args,
|
|||
|
||||
// Deactivate the cleanup for the callee-destructed param that was pushed.
|
||||
if (hasAggregateEvaluationKind(type) && !CurFuncIsThunk &&
|
||||
type->getAs<RecordType>()->getDecl()->isParamDestroyedInCallee() &&
|
||||
type->castAs<RecordType>()->getDecl()->isParamDestroyedInCallee() &&
|
||||
param->needsDestruction(getContext())) {
|
||||
EHScopeStack::stable_iterator cleanup =
|
||||
CalleeDestructedParamCleanups.lookup(cast<ParmVarDecl>(param));
|
||||
|
@ -3577,7 +3577,7 @@ void CodeGenFunction::EmitCallArg(CallArgList &args, const Expr *E,
|
|||
// However, we still have to push an EH-only cleanup in case we unwind before
|
||||
// we make it to the call.
|
||||
if (HasAggregateEvalKind &&
|
||||
type->getAs<RecordType>()->getDecl()->isParamDestroyedInCallee()) {
|
||||
type->castAs<RecordType>()->getDecl()->isParamDestroyedInCallee()) {
|
||||
// If we're using inalloca, use the argument memory. Otherwise, use a
|
||||
// temporary.
|
||||
AggValueSlot Slot;
|
||||
|
|
|
@ -161,8 +161,8 @@ CharUnits CodeGenModule::computeNonVirtualBaseClassOffset(
|
|||
// Get the layout.
|
||||
const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
|
||||
|
||||
const CXXRecordDecl *BaseDecl =
|
||||
cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *BaseDecl =
|
||||
cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Add the offset.
|
||||
Offset += Layout.getBaseClassOffset(BaseDecl);
|
||||
|
@ -279,8 +279,8 @@ Address CodeGenFunction::GetAddressOfBaseClass(
|
|||
// *start* with a step down to the correct virtual base subobject,
|
||||
// and hence will not require any further steps.
|
||||
if ((*Start)->isVirtual()) {
|
||||
VBase =
|
||||
cast<CXXRecordDecl>((*Start)->getType()->getAs<RecordType>()->getDecl());
|
||||
VBase = cast<CXXRecordDecl>(
|
||||
(*Start)->getType()->castAs<RecordType>()->getDecl());
|
||||
++Start;
|
||||
}
|
||||
|
||||
|
@ -536,8 +536,8 @@ static void EmitBaseInitializer(CodeGenFunction &CGF,
|
|||
Address ThisPtr = CGF.LoadCXXThisAddress();
|
||||
|
||||
const Type *BaseType = BaseInit->getBaseClass();
|
||||
CXXRecordDecl *BaseClassDecl =
|
||||
cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
|
||||
const auto *BaseClassDecl =
|
||||
cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl());
|
||||
|
||||
bool isBaseVirtual = BaseInit->isBaseVirtual();
|
||||
|
||||
|
@ -1245,7 +1245,7 @@ namespace {
|
|||
static bool isInitializerOfDynamicClass(const CXXCtorInitializer *BaseInit) {
|
||||
const Type *BaseType = BaseInit->getBaseClass();
|
||||
const auto *BaseClassDecl =
|
||||
cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
|
||||
cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl());
|
||||
return BaseClassDecl->isDynamicClass();
|
||||
}
|
||||
|
||||
|
@ -1814,8 +1814,8 @@ void CodeGenFunction::EnterDtorCleanups(const CXXDestructorDecl *DD,
|
|||
// We push them in the forward order so that they'll be popped in
|
||||
// the reverse order.
|
||||
for (const auto &Base : ClassDecl->vbases()) {
|
||||
CXXRecordDecl *BaseClassDecl
|
||||
= cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
|
||||
auto *BaseClassDecl =
|
||||
cast<CXXRecordDecl>(Base.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Ignore trivial destructors.
|
||||
if (BaseClassDecl->hasTrivialDestructor())
|
||||
|
@ -2530,8 +2530,8 @@ void CodeGenFunction::getVTablePointers(BaseSubobject Base,
|
|||
|
||||
// Traverse bases.
|
||||
for (const auto &I : RD->bases()) {
|
||||
CXXRecordDecl *BaseDecl
|
||||
= cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
auto *BaseDecl =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Ignore classes without a vtable.
|
||||
if (!BaseDecl->isDynamicClass())
|
||||
|
|
|
@ -1699,7 +1699,7 @@ void CGDebugInfo::CollectCXXBasesAux(
|
|||
const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
|
||||
for (const auto &BI : Bases) {
|
||||
const auto *Base =
|
||||
cast<CXXRecordDecl>(BI.getType()->getAs<RecordType>()->getDecl());
|
||||
cast<CXXRecordDecl>(BI.getType()->castAs<RecordType>()->getDecl());
|
||||
if (!SeenTypes.insert(Base).second)
|
||||
continue;
|
||||
auto *BaseTy = getOrCreateType(BI.getType(), Unit);
|
||||
|
|
|
@ -2395,7 +2395,7 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
|
|||
// Don't push a cleanup in a thunk for a method that will also emit a
|
||||
// cleanup.
|
||||
if (hasAggregateEvaluationKind(Ty) && !CurFuncIsThunk &&
|
||||
Ty->getAs<RecordType>()->getDecl()->isParamDestroyedInCallee()) {
|
||||
Ty->castAs<RecordType>()->getDecl()->isParamDestroyedInCallee()) {
|
||||
if (QualType::DestructionKind DtorKind =
|
||||
D.needsDestruction(getContext())) {
|
||||
assert((DtorKind == QualType::DK_cxx_destructor ||
|
||||
|
|
|
@ -418,13 +418,10 @@ CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
|
|||
const Expr *BaseExpr = BO->getLHS();
|
||||
const Expr *MemFnExpr = BO->getRHS();
|
||||
|
||||
const MemberPointerType *MPT =
|
||||
MemFnExpr->getType()->castAs<MemberPointerType>();
|
||||
|
||||
const FunctionProtoType *FPT =
|
||||
MPT->getPointeeType()->castAs<FunctionProtoType>();
|
||||
const CXXRecordDecl *RD =
|
||||
cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
|
||||
const auto *MPT = MemFnExpr->getType()->castAs<MemberPointerType>();
|
||||
const auto *FPT = MPT->getPointeeType()->castAs<FunctionProtoType>();
|
||||
const auto *RD =
|
||||
cast<CXXRecordDecl>(MPT->getClass()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Emit the 'this' pointer.
|
||||
Address This = Address::invalid();
|
||||
|
|
|
@ -659,7 +659,7 @@ static bool EmitDesignatedInitUpdater(ConstantEmitter &Emitter,
|
|||
}
|
||||
|
||||
bool ConstStructBuilder::Build(InitListExpr *ILE, bool AllowOverwrite) {
|
||||
RecordDecl *RD = ILE->getType()->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = ILE->getType()->castAs<RecordType>()->getDecl();
|
||||
const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
|
||||
|
||||
unsigned FieldNo = -1;
|
||||
|
@ -839,7 +839,7 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
|
|||
}
|
||||
|
||||
llvm::Constant *ConstStructBuilder::Finalize(QualType Type) {
|
||||
RecordDecl *RD = Type->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = Type->castAs<RecordType>()->getDecl();
|
||||
llvm::Type *ValTy = CGM.getTypes().ConvertType(Type);
|
||||
return Builder.build(ValTy, RD->hasFlexibleArrayMember());
|
||||
}
|
||||
|
|
|
@ -2662,7 +2662,7 @@ Value *ScalarExprEmitter::VisitOffsetOfExpr(OffsetOfExpr *E) {
|
|||
|
||||
case OffsetOfNode::Field: {
|
||||
FieldDecl *MemberDecl = ON.getField();
|
||||
RecordDecl *RD = CurrentType->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = CurrentType->castAs<RecordType>()->getDecl();
|
||||
const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD);
|
||||
|
||||
// Compute the index of the field in its parent.
|
||||
|
@ -2695,7 +2695,7 @@ Value *ScalarExprEmitter::VisitOffsetOfExpr(OffsetOfExpr *E) {
|
|||
continue;
|
||||
}
|
||||
|
||||
RecordDecl *RD = CurrentType->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = CurrentType->castAs<RecordType>()->getDecl();
|
||||
const ASTRecordLayout &RL = CGF.getContext().getASTRecordLayout(RD);
|
||||
|
||||
// Save the element type.
|
||||
|
|
|
@ -135,8 +135,8 @@ isSafeToConvert(const RecordDecl *RD, CodeGenTypes &CGT,
|
|||
// the class.
|
||||
if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
|
||||
for (const auto &I : CRD->bases())
|
||||
if (!isSafeToConvert(I.getType()->getAs<RecordType>()->getDecl(),
|
||||
CGT, AlreadyChecked))
|
||||
if (!isSafeToConvert(I.getType()->castAs<RecordType>()->getDecl(), CGT,
|
||||
AlreadyChecked))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -744,8 +744,7 @@ llvm::StructType *CodeGenTypes::ConvertRecordDeclType(const RecordDecl *RD) {
|
|||
if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
|
||||
for (const auto &I : CRD->bases()) {
|
||||
if (I.isVirtual()) continue;
|
||||
|
||||
ConvertRecordDeclType(I.getType()->getAs<RecordType>()->getDecl());
|
||||
ConvertRecordDeclType(I.getType()->castAs<RecordType>()->getDecl());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2809,8 +2809,8 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
|
|||
for (const auto &I : CXXRD->bases()) {
|
||||
assert(!I.isVirtual() && !I.getType()->isDependentType() &&
|
||||
"Unexpected base class!");
|
||||
const CXXRecordDecl *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// Classify this field.
|
||||
//
|
||||
|
@ -3071,8 +3071,8 @@ static bool BitsContainNoUserData(QualType Ty, unsigned StartBit,
|
|||
for (const auto &I : CXXRD->bases()) {
|
||||
assert(!I.isVirtual() && !I.getType()->isDependentType() &&
|
||||
"Unexpected base class!");
|
||||
const CXXRecordDecl *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
|
||||
// If the base is after the span we care about, ignore it.
|
||||
unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base));
|
||||
|
|
|
@ -852,7 +852,7 @@ RewriteModernObjC::getIvarAccessString(ObjCIvarDecl *D) {
|
|||
IvarT = GetGroupRecordTypeForObjCIvarBitfield(D);
|
||||
|
||||
if (!isa<TypedefType>(IvarT) && IvarT->isRecordType()) {
|
||||
RecordDecl *RD = IvarT->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = IvarT->castAs<RecordType>()->getDecl();
|
||||
RD = RD->getDefinition();
|
||||
if (RD && !RD->getDeclName().getAsIdentifierInfo()) {
|
||||
// decltype(((Foo_IMPL*)0)->bar) *
|
||||
|
@ -3637,7 +3637,7 @@ bool RewriteModernObjC::RewriteObjCFieldDeclType(QualType &Type,
|
|||
return RewriteObjCFieldDeclType(ElemTy, Result);
|
||||
}
|
||||
else if (Type->isRecordType()) {
|
||||
RecordDecl *RD = Type->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = Type->castAs<RecordType>()->getDecl();
|
||||
if (RD->isCompleteDefinition()) {
|
||||
if (RD->isStruct())
|
||||
Result += "\n\tstruct ";
|
||||
|
@ -3727,15 +3727,15 @@ void RewriteModernObjC::RewriteLocallyDefinedNamedAggregates(FieldDecl *fieldDec
|
|||
return;
|
||||
if (Type->isArrayType())
|
||||
Type = Context->getBaseElementType(Type);
|
||||
ObjCContainerDecl *IDecl =
|
||||
dyn_cast<ObjCContainerDecl>(fieldDecl->getDeclContext());
|
||||
|
||||
auto *IDecl = dyn_cast<ObjCContainerDecl>(fieldDecl->getDeclContext());
|
||||
|
||||
TagDecl *TD = nullptr;
|
||||
if (Type->isRecordType()) {
|
||||
TD = Type->getAs<RecordType>()->getDecl();
|
||||
TD = Type->castAs<RecordType>()->getDecl();
|
||||
}
|
||||
else if (Type->isEnumeralType()) {
|
||||
TD = Type->getAs<EnumType>()->getDecl();
|
||||
TD = Type->castAs<EnumType>()->getDecl();
|
||||
}
|
||||
|
||||
if (TD) {
|
||||
|
@ -5753,7 +5753,7 @@ void RewriteModernObjC::HandleDeclInMainFile(Decl *D) {
|
|||
}
|
||||
}
|
||||
} else if (VD->getType()->isRecordType()) {
|
||||
RecordDecl *RD = VD->getType()->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = VD->getType()->castAs<RecordType>()->getDecl();
|
||||
if (RD->isCompleteDefinition())
|
||||
RewriteRecordBody(RD);
|
||||
}
|
||||
|
@ -7494,7 +7494,7 @@ Stmt *RewriteModernObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
|
|||
IvarT = GetGroupRecordTypeForObjCIvarBitfield(D);
|
||||
|
||||
if (!isa<TypedefType>(IvarT) && IvarT->isRecordType()) {
|
||||
RecordDecl *RD = IvarT->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = IvarT->castAs<RecordType>()->getDecl();
|
||||
RD = RD->getDefinition();
|
||||
if (RD && !RD->getDeclName().getAsIdentifierInfo()) {
|
||||
// decltype(((Foo_IMPL*)0)->bar) *
|
||||
|
|
|
@ -4849,7 +4849,7 @@ void RewriteObjC::HandleDeclInMainFile(Decl *D) {
|
|||
}
|
||||
}
|
||||
} else if (VD->getType()->isRecordType()) {
|
||||
RecordDecl *RD = VD->getType()->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = VD->getType()->castAs<RecordType>()->getDecl();
|
||||
if (RD->isCompleteDefinition())
|
||||
RewriteRecordBody(RD);
|
||||
}
|
||||
|
|
|
@ -1834,8 +1834,8 @@ Sema::AccessResult Sema::CheckBaseClassAccess(SourceLocation AccessLoc,
|
|||
return AR_accessible;
|
||||
|
||||
CXXRecordDecl *BaseD, *DerivedD;
|
||||
BaseD = cast<CXXRecordDecl>(Base->getAs<RecordType>()->getDecl());
|
||||
DerivedD = cast<CXXRecordDecl>(Derived->getAs<RecordType>()->getDecl());
|
||||
BaseD = cast<CXXRecordDecl>(Base->castAs<RecordType>()->getDecl());
|
||||
DerivedD = cast<CXXRecordDecl>(Derived->castAs<RecordType>()->getDecl());
|
||||
|
||||
AccessTarget Entity(Context, AccessTarget::Base, BaseD, DerivedD,
|
||||
Path.Access);
|
||||
|
|
|
@ -14509,7 +14509,7 @@ void Sema::RefersToMemberWithReducedAlignment(
|
|||
QualType BaseType = ME->getBase()->getType();
|
||||
if (ME->isArrow())
|
||||
BaseType = BaseType->getPointeeType();
|
||||
RecordDecl *RD = BaseType->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *RD = BaseType->castAs<RecordType>()->getDecl();
|
||||
if (RD->isInvalidDecl())
|
||||
return;
|
||||
|
||||
|
|
|
@ -7767,7 +7767,7 @@ struct FindOverriddenMethod {
|
|||
/// CXXRecordDecl::lookupInBases().
|
||||
bool operator()(const CXXBaseSpecifier *Specifier, CXXBasePath &Path) {
|
||||
RecordDecl *BaseRecord =
|
||||
Specifier->getType()->getAs<RecordType>()->getDecl();
|
||||
Specifier->getType()->castAs<RecordType>()->getDecl();
|
||||
|
||||
DeclarationName Name = Method->getDeclName();
|
||||
|
||||
|
@ -16560,7 +16560,7 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
|
|||
else if (Context.getAsArrayType(FD->getType())) {
|
||||
QualType BaseType = Context.getBaseElementType(FD->getType());
|
||||
if (BaseType->isRecordType() &&
|
||||
BaseType->getAs<RecordType>()->getDecl()->hasObjectMember())
|
||||
BaseType->castAs<RecordType>()->getDecl()->hasObjectMember())
|
||||
Record->setHasObjectMember(true);
|
||||
else if (BaseType->isObjCObjectPointerType() ||
|
||||
BaseType.isObjCGCStrong())
|
||||
|
|
|
@ -547,7 +547,7 @@ static bool checkRecordDeclForAttr(const RecordDecl *RD) {
|
|||
// If it's type-dependent, we assume it could have the attribute.
|
||||
if (Ty.isDependentType())
|
||||
return true;
|
||||
return Ty.getAs<RecordType>()->getDecl()->hasAttr<AttrType>();
|
||||
return Ty.castAs<RecordType>()->getDecl()->hasAttr<AttrType>();
|
||||
},
|
||||
BPaths, true))
|
||||
return true;
|
||||
|
|
|
@ -2479,7 +2479,7 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class,
|
|||
}
|
||||
|
||||
// If the base class is polymorphic or isn't empty, the new one is/isn't, too.
|
||||
RecordDecl *BaseDecl = BaseType->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *BaseDecl = BaseType->castAs<RecordType>()->getDecl();
|
||||
assert(BaseDecl && "Record type has no declaration");
|
||||
BaseDecl = BaseDecl->getDefinition();
|
||||
assert(BaseDecl && "Base type is not incomplete, but has no definition");
|
||||
|
@ -8004,7 +8004,7 @@ public:
|
|||
/// to be used with CXXRecordDecl::lookupInBases().
|
||||
bool operator()(const CXXBaseSpecifier *Specifier, CXXBasePath &Path) {
|
||||
RecordDecl *BaseRecord =
|
||||
Specifier->getType()->getAs<RecordType>()->getDecl();
|
||||
Specifier->getType()->castAs<RecordType>()->getDecl();
|
||||
|
||||
DeclarationName Name = Method->getDeclName();
|
||||
assert(Name.getNameKind() == DeclarationName::Identifier);
|
||||
|
@ -11845,7 +11845,8 @@ buildMemcpyForAssignmentOp(Sema &S, SourceLocation Loc, QualType T,
|
|||
|
||||
const Type *E = T->getBaseElementTypeUnsafe();
|
||||
bool NeedsCollectableMemCpy =
|
||||
E->isRecordType() && E->getAs<RecordType>()->getDecl()->hasObjectMember();
|
||||
E->isRecordType() &&
|
||||
E->castAs<RecordType>()->getDecl()->hasObjectMember();
|
||||
|
||||
// Create a reference to the __builtin_objc_memmove_collectable function
|
||||
StringRef MemCpyName = NeedsCollectableMemCpy ?
|
||||
|
@ -15535,8 +15536,8 @@ void Sema::MarkVirtualMembersReferenced(SourceLocation Loc,
|
|||
return;
|
||||
|
||||
for (const auto &I : RD->bases()) {
|
||||
const CXXRecordDecl *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl());
|
||||
const auto *Base =
|
||||
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
|
||||
if (Base->getNumVBases() == 0)
|
||||
continue;
|
||||
MarkVirtualMembersReferenced(Loc, Base);
|
||||
|
|
|
@ -154,7 +154,7 @@ bool Sema::CheckSpecifiedExceptionType(QualType &T, SourceRange Range) {
|
|||
ReturnValueOnError = false;
|
||||
}
|
||||
if (!(PointeeT->isRecordType() &&
|
||||
PointeeT->getAs<RecordType>()->isBeingDefined()) &&
|
||||
PointeeT->castAs<RecordType>()->isBeingDefined()) &&
|
||||
RequireCompleteType(Range.getBegin(), PointeeT, DiagID, Kind, Range))
|
||||
return ReturnValueOnError;
|
||||
|
||||
|
|
|
@ -2457,8 +2457,8 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
|
|||
// deallocation function's name is looked up in the global scope.
|
||||
LookupResult FoundDelete(*this, DeleteName, StartLoc, LookupOrdinaryName);
|
||||
if (AllocElemType->isRecordType() && DeleteScope != AFS_Global) {
|
||||
CXXRecordDecl *RD
|
||||
= cast<CXXRecordDecl>(AllocElemType->getAs<RecordType>()->getDecl());
|
||||
auto *RD =
|
||||
cast<CXXRecordDecl>(AllocElemType->castAs<RecordType>()->getDecl());
|
||||
LookupQualifiedName(FoundDelete, RD);
|
||||
}
|
||||
if (FoundDelete.isAmbiguous())
|
||||
|
|
|
@ -1006,7 +1006,7 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
|
|||
// Rederive where we looked up.
|
||||
DeclContext *DC = (SS.isSet()
|
||||
? computeDeclContext(SS, false)
|
||||
: BaseType->getAs<RecordType>()->getDecl());
|
||||
: BaseType->castAs<RecordType>()->getDecl());
|
||||
|
||||
if (ExtraArgs) {
|
||||
ExprResult RetryExpr;
|
||||
|
|
|
@ -2130,7 +2130,7 @@ static bool LookupQualifiedNameInUsingDirectives(Sema &S, LookupResult &R,
|
|||
/// Callback that looks for any member of a class with the given name.
|
||||
static bool LookupAnyMember(const CXXBaseSpecifier *Specifier,
|
||||
CXXBasePath &Path, DeclarationName Name) {
|
||||
RecordDecl *BaseRecord = Specifier->getType()->getAs<RecordType>()->getDecl();
|
||||
RecordDecl *BaseRecord = Specifier->getType()->castAs<RecordType>()->getDecl();
|
||||
|
||||
Path.Decls = BaseRecord->lookup(Name);
|
||||
return !Path.Decls.empty();
|
||||
|
|
Loading…
Reference in New Issue