Author: Simon Pilgrim Date: 2020-03-04T11:25:50Z New Revision: 94885431e19687dcc8f2e2f23932b4a6d170b78d
URL: https://github.com/llvm/llvm-project/commit/94885431e19687dcc8f2e2f23932b4a6d170b78d DIFF: https://github.com/llvm/llvm-project/commit/94885431e19687dcc8f2e2f23932b4a6d170b78d.diff LOG: Fix some getAs/castAs null dereference static analyzer warnings. Use castAs if we know the cast should succeed (or we're dereferencing without check), the castAs will assert as well so we can remove local non-null asserts. Added: Modified: clang/lib/Sema/SemaExprCXX.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index e521ba1d4af1..b2e21bebd38f 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -2142,8 +2142,7 @@ Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, SmallVector<Expr *, 8> AllPlaceArgs; if (OperatorNew) { - const FunctionProtoType *Proto = - OperatorNew->getType()->getAs<FunctionProtoType>(); + auto *Proto = OperatorNew->getType()->castAs<FunctionProtoType>(); VariadicCallType CallType = Proto->isVariadic() ? VariadicFunction : VariadicDoesNotApply; @@ -2658,8 +2657,7 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, // for template argument deduction and for comparison purposes. QualType ExpectedFunctionType; { - const FunctionProtoType *Proto - = OperatorNew->getType()->getAs<FunctionProtoType>(); + auto *Proto = OperatorNew->getType()->castAs<FunctionProtoType>(); SmallVector<QualType, 4> ArgTypes; ArgTypes.push_back(Context.VoidPtrTy); @@ -4359,9 +4357,7 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType, // Case 2. _Complex x -> y } else { - const ComplexType *FromComplex = From->getType()->getAs<ComplexType>(); - assert(FromComplex); - + auto *FromComplex = From->getType()->castAs<ComplexType>(); QualType ElType = FromComplex->getElementType(); bool isFloatingComplex = ElType->isRealFloatingType(); @@ -4660,8 +4656,7 @@ static bool HasNoThrowOperator(const RecordType *RT, OverloadedOperatorKind Op, CXXMethodDecl *Operator = cast<CXXMethodDecl>(*Op); if((Operator->*IsDesiredOp)()) { FoundOperator = true; - const FunctionProtoType *CPT = - Operator->getType()->getAs<FunctionProtoType>(); + auto *CPT = Operator->getType()->castAs<FunctionProtoType>(); CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); if (!CPT || !CPT->isNothrow()) return false; @@ -4910,8 +4905,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT, if (C.getLangOpts().AccessControl && Destructor->getAccess() != AS_public) return false; if (UTT == UTT_IsNothrowDestructible) { - const FunctionProtoType *CPT = - Destructor->getType()->getAs<FunctionProtoType>(); + auto *CPT = Destructor->getType()->castAs<FunctionProtoType>(); CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); if (!CPT || !CPT->isNothrow()) return false; @@ -4999,8 +4993,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT, auto *Constructor = cast<CXXConstructorDecl>(ND->getUnderlyingDecl()); if (Constructor->isCopyConstructor(FoundTQs)) { FoundConstructor = true; - const FunctionProtoType *CPT - = Constructor->getType()->getAs<FunctionProtoType>(); + auto *CPT = Constructor->getType()->castAs<FunctionProtoType>(); CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); if (!CPT) return false; @@ -5038,8 +5031,7 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT, auto *Constructor = cast<CXXConstructorDecl>(ND->getUnderlyingDecl()); if (Constructor->isDefaultConstructor()) { FoundConstructor = true; - const FunctionProtoType *CPT - = Constructor->getType()->getAs<FunctionProtoType>(); + auto *CPT = Constructor->getType()->castAs<FunctionProtoType>(); CPT = Self.ResolveExceptionSpec(KeyLoc, CPT); if (!CPT) return false; @@ -5924,7 +5916,7 @@ QualType Sema::CheckGNUVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, RHS = DefaultFunctionArrayLvalueConversion(RHS.get()); QualType CondType = Cond.get()->getType(); - const auto *CondVT = CondType->getAs<VectorType>(); + const auto *CondVT = CondType->castAs<VectorType>(); QualType CondElementTy = CondVT->getElementType(); unsigned CondElementCount = CondVT->getNumElements(); QualType LHSType = LHS.get()->getType(); @@ -5980,7 +5972,7 @@ QualType Sema::CheckGNUVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, return {}; } ResultType = Context.getVectorType( - ResultElementTy, CondType->getAs<VectorType>()->getNumElements(), + ResultElementTy, CondType->castAs<VectorType>()->getNumElements(), VectorType::GenericVector); LHS = ImpCastExprToType(LHS.get(), ResultType, CK_VectorSplat); @@ -5989,9 +5981,9 @@ QualType Sema::CheckGNUVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, assert(!ResultType.isNull() && ResultType->isVectorType() && "Result should have been a vector type"); - QualType ResultElementTy = ResultType->getAs<VectorType>()->getElementType(); - unsigned ResultElementCount = - ResultType->getAs<VectorType>()->getNumElements(); + auto *ResultVectorTy = ResultType->castAs<VectorType>(); + QualType ResultElementTy = ResultVectorTy->getElementType(); + unsigned ResultElementCount = ResultVectorTy->getNumElements(); if (ResultElementCount != CondElementCount) { Diag(QuestionLoc, diag::err_conditional_vector_size) << CondType @@ -6788,8 +6780,7 @@ ExprResult Sema::MaybeBindToTemporary(Expr *E) { else if (const MemberPointerType *MemPtr = T->getAs<MemberPointerType>()) T = MemPtr->getPointeeType(); - const FunctionType *FTy = T->getAs<FunctionType>(); - assert(FTy && "call to value not of function type?"); + auto *FTy = T->castAs<FunctionType>(); ReturnsRetained = FTy->getExtInfo().getProducesResult(); // ActOnStmtExpr arranges things so that StmtExprs of retainable _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits