From: Aaron Ballman Date: Mon, 17 Mar 2014 15:23:01 +0000 (+0000) Subject: [C++11] Replacing FunctionProtoType iterators param_type_begin() and param_type_end... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c4430a74cb88c0f0281ad6738feab20e9a7e481e;p=clang [C++11] Replacing FunctionProtoType iterators param_type_begin() and param_type_end() with iterator_range param_types(). Updating all of the usages of the iterators with range-based for loops. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204045 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DataRecursiveASTVisitor.h b/include/clang/AST/DataRecursiveASTVisitor.h index b8be92a85e..a92c334957 100644 --- a/include/clang/AST/DataRecursiveASTVisitor.h +++ b/include/clang/AST/DataRecursiveASTVisitor.h @@ -873,10 +873,8 @@ DEF_TRAVERSE_TYPE(FunctionNoProtoType, DEF_TRAVERSE_TYPE(FunctionProtoType, { TRY_TO(TraverseType(T->getReturnType())); - for (FunctionProtoType::param_type_iterator A = T->param_type_begin(), - AEnd = T->param_type_end(); - A != AEnd; ++A) { - TRY_TO(TraverseType(*A)); + for (const auto &A : T->param_types()) { + TRY_TO(TraverseType(A)); } for (FunctionProtoType::exception_iterator E = T->exception_begin(), diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index 0318654340..608ad195df 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -954,10 +954,8 @@ DEF_TRAVERSE_TYPE(FunctionNoProtoType, DEF_TRAVERSE_TYPE(FunctionProtoType, { TRY_TO(TraverseType(T->getReturnType())); - for (FunctionProtoType::param_type_iterator A = T->param_type_begin(), - AEnd = T->param_type_end(); - A != AEnd; ++A) { - TRY_TO(TraverseType(*A)); + for (const auto &A : T->param_types()) { + TRY_TO(TraverseType(A)); } for (FunctionProtoType::exception_iterator E = T->exception_begin(), diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index ba4a1e39d3..ae34f42724 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -626,11 +626,11 @@ public: // Iterators child_range children() { - return child_range(&Body[0], &Body[0]+CompoundStmtBits.NumStmts); + return child_range(Body, Body + CompoundStmtBits.NumStmts); } const_child_range children() const { - return child_range(&Body[0], &Body[0]+CompoundStmtBits.NumStmts); + return child_range(Body, Body + CompoundStmtBits.NumStmts); } }; diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index 3dce45596b..6b3bac1e60 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -26,6 +26,7 @@ #include "clang/Basic/Visibility.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/FoldingSet.h" +#include "llvm/ADT/iterator_range.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/PointerUnion.h" @@ -3059,6 +3060,11 @@ public: } typedef const QualType *param_type_iterator; + typedef llvm::iterator_range param_type_range; + + param_type_range param_types() const { + return param_type_range(param_type_begin(), param_type_end()); + } param_type_iterator param_type_begin() const { return reinterpret_cast(this+1); } diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index bc1f3a821c..3af3bff040 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -5380,19 +5380,11 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, S += "@?"; // Block parameters if (const FunctionProtoType *FPT = dyn_cast(FT)) { - for (FunctionProtoType::param_type_iterator I = FPT->param_type_begin(), - E = FPT->param_type_end(); - I && (I != E); ++I) { - getObjCEncodingForTypeImpl(*I, S, - ExpandPointedToStructures, - ExpandStructures, - FD, - false /* OutermostType */, - EncodingProperty, - false /* StructField */, - EncodeBlockParameters, - EncodeClassNames); - } + for (const auto &I : FPT->param_types()) + getObjCEncodingForTypeImpl( + I, S, ExpandPointedToStructures, ExpandStructures, FD, + false /* OutermostType */, EncodingProperty, + false /* StructField */, EncodeBlockParameters, EncodeClassNames); } S += '>'; } diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp index a73c1e68a9..318636a575 100644 --- a/lib/AST/ASTImporter.cpp +++ b/lib/AST/ASTImporter.cpp @@ -1598,10 +1598,8 @@ QualType ASTNodeImporter::VisitFunctionProtoType(const FunctionProtoType *T) { // Import argument types SmallVector ArgTypes; - for (FunctionProtoType::param_type_iterator A = T->param_type_begin(), - AEnd = T->param_type_end(); - A != AEnd; ++A) { - QualType ArgType = Importer.Import(*A); + for (const auto &A : T->param_types()) { + QualType ArgType = Importer.Import(A); if (ArgType.isNull()) return QualType(); ArgTypes.push_back(ArgType); diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 16e1e1c775..c3354c4f34 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -2012,10 +2012,8 @@ void CXXNameMangler::mangleBareFunctionType(const FunctionType *T, return; } - for (FunctionProtoType::param_type_iterator Arg = Proto->param_type_begin(), - ArgEnd = Proto->param_type_end(); - Arg != ArgEnd; ++Arg) - mangleType(Context.getASTContext().getSignatureParameterType(*Arg)); + for (const auto &Arg : Proto->param_types()) + mangleType(Context.getASTContext().getSignatureParameterType(Arg)); FunctionTypeDepth.pop(saved); diff --git a/lib/AST/Mangle.cpp b/lib/AST/Mangle.cpp index 96e844746c..fdc00e3893 100644 --- a/lib/AST/Mangle.cpp +++ b/lib/AST/Mangle.cpp @@ -163,13 +163,9 @@ void MangleContext::mangleName(const NamedDecl *D, raw_ostream &Out) { if (const CXXMethodDecl *MD = dyn_cast(FD)) if (!MD->isStatic()) ++ArgWords; - for (FunctionProtoType::param_type_iterator Arg = Proto->param_type_begin(), - ArgEnd = Proto->param_type_end(); - Arg != ArgEnd; ++Arg) { - QualType AT = *Arg; + for (const auto &AT : Proto->param_types()) // Size should be aligned to DWORD boundary ArgWords += llvm::RoundUpToAlignment(ASTContext.getTypeSize(AT), 32) / 32; - } Out << 4 * ArgWords; } diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 3eac72fe86..1acf658c35 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -1551,11 +1551,8 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T, Out << 'X'; } else { // Happens for function pointer type arguments for example. - for (FunctionProtoType::param_type_iterator - Arg = Proto->param_type_begin(), - ArgEnd = Proto->param_type_end(); - Arg != ArgEnd; ++Arg) - mangleArgumentType(*Arg, Range); + for (const auto &Arg : Proto->param_types()) + mangleArgumentType(Arg, Range); // ::= Z # ellipsis if (Proto->isVariadic()) Out << 'Z'; diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 6fb1172a89..32e7b020d5 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -2232,10 +2232,8 @@ static CachedProperties computeCachedProperties(const Type *T) { case Type::FunctionProto: { const FunctionProtoType *FPT = cast(T); CachedProperties result = Cache::get(FPT->getReturnType()); - for (FunctionProtoType::param_type_iterator ai = FPT->param_type_begin(), - ae = FPT->param_type_end(); - ai != ae; ++ai) - result = merge(result, Cache::get(*ai)); + for (const auto &ai : FPT->param_types()) + result = merge(result, Cache::get(ai)); return result; } case Type::ObjCInterface: { @@ -2318,10 +2316,8 @@ static LinkageInfo computeLinkageInfo(const Type *T) { case Type::FunctionProto: { const FunctionProtoType *FPT = cast(T); LinkageInfo LV = computeLinkageInfo(FPT->getReturnType()); - for (FunctionProtoType::param_type_iterator ai = FPT->param_type_begin(), - ae = FPT->param_type_end(); - ai != ae; ++ai) - LV.merge(computeLinkageInfo(*ai)); + for (const auto &ai : FPT->param_types()) + LV.merge(computeLinkageInfo(ai)); return LV; } case Type::ObjCInterface: diff --git a/lib/Index/USRGeneration.cpp b/lib/Index/USRGeneration.cpp index c6dbabb519..850a90d53e 100644 --- a/lib/Index/USRGeneration.cpp +++ b/lib/Index/USRGeneration.cpp @@ -638,11 +638,8 @@ void USRGenerator::VisitType(QualType T) { if (const FunctionProtoType *FT = T->getAs()) { Out << 'F'; VisitType(FT->getReturnType()); - for (FunctionProtoType::param_type_iterator I = FT->param_type_begin(), - E = FT->param_type_end(); - I != E; ++I) { - VisitType(*I); - } + for (const auto &I : FT->param_types()) + VisitType(I); if (FT->isVariadic()) Out << '.'; return; diff --git a/lib/Rewrite/Frontend/RewriteModernObjC.cpp b/lib/Rewrite/Frontend/RewriteModernObjC.cpp index 8801a3c8c7..febfb9bce7 100644 --- a/lib/Rewrite/Frontend/RewriteModernObjC.cpp +++ b/lib/Rewrite/Frontend/RewriteModernObjC.cpp @@ -623,10 +623,8 @@ void RewriteModernObjC::RewriteBlocksInFunctionProtoType(QualType funcType, NamedDecl *D) { if (const FunctionProtoType *fproto = dyn_cast(funcType.IgnoreParens())) { - for (FunctionProtoType::param_type_iterator I = fproto->param_type_begin(), - E = fproto->param_type_end(); - I && (I != E); ++I) - if (isTopLevelBlockPointerType(*I)) { + for (const auto &I : fproto->param_types()) + if (isTopLevelBlockPointerType(I)) { // All the args are checked/rewritten. Don't call twice! RewriteBlockPointerDecl(D); break; @@ -4660,10 +4658,8 @@ QualType RewriteModernObjC::convertFunctionTypeOfBlocks(const FunctionType *FT) bool modified = convertObjCTypeToCStyleType(Res); if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I && (I != E); ++I) { - QualType t = *I; + for (auto &I : FTP->param_types()) { + QualType t = I; // Make sure we convert "t (^)(...)" to "t (*)(...)". if (convertObjCTypeToCStyleType(t)) modified = true; @@ -4729,10 +4725,8 @@ Stmt *RewriteModernObjC::SynthesizeBlockCall(CallExpr *Exp, const Expr *BlockExp // Push the block argument type. ArgTypes.push_back(PtrBlock); if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I && (I != E); ++I) { - QualType t = *I; + for (auto &I : FTP->param_types()) { + QualType t = I; // Make sure we convert "t (^)(...)" to "t (*)(...)". if (!convertBlockPointerToFunctionPointer(t)) convertToUnqualifiedObjCType(t); @@ -4950,10 +4944,8 @@ bool RewriteModernObjC::PointerTypeTakesAnyBlockArguments(QualType QT) { FTP = BPT->getPointeeType()->getAs(); } if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I != E; ++I) - if (isTopLevelBlockPointerType(*I)) + for (const auto &I : FTP->param_types()) + if (isTopLevelBlockPointerType(I)) return true; } return false; @@ -4970,13 +4962,11 @@ bool RewriteModernObjC::PointerTypeTakesAnyObjCQualifiedType(QualType QT) { FTP = BPT->getPointeeType()->getAs(); } if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I != E; ++I) { - if ((*I)->isObjCQualifiedIdType()) + for (const auto &I : FTP->param_types()) { + if (I->isObjCQualifiedIdType()) return true; - if ((*I)->isObjCObjectPointerType() && - (*I)->getPointeeType()->isObjCQualifiedInterfaceType()) + if (I->isObjCObjectPointerType() && + I->getPointeeType()->isObjCQualifiedInterfaceType()) return true; } diff --git a/lib/Rewrite/Frontend/RewriteObjC.cpp b/lib/Rewrite/Frontend/RewriteObjC.cpp index 18e3dbc839..80d6cc6c33 100644 --- a/lib/Rewrite/Frontend/RewriteObjC.cpp +++ b/lib/Rewrite/Frontend/RewriteObjC.cpp @@ -554,10 +554,8 @@ void RewriteObjC::RewriteBlocksInFunctionProtoType(QualType funcType, NamedDecl *D) { if (const FunctionProtoType *fproto = dyn_cast(funcType.IgnoreParens())) { - for (FunctionProtoType::param_type_iterator I = fproto->param_type_begin(), - E = fproto->param_type_end(); - I && (I != E); ++I) - if (isTopLevelBlockPointerType(*I)) { + for (const auto &I : fproto->param_types()) + if (isTopLevelBlockPointerType(I)) { // All the args are checked/rewritten. Don't call twice! RewriteBlockPointerDecl(D); break; @@ -3741,10 +3739,8 @@ QualType RewriteObjC::convertFunctionTypeOfBlocks(const FunctionType *FT) { bool HasBlockType = convertBlockPointerToFunctionPointer(Res); if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I && (I != E); ++I) { - QualType t = *I; + for (auto &I : FTP->param_types()) { + QualType t = I; // Make sure we convert "t (^)(...)" to "t (*)(...)". if (convertBlockPointerToFunctionPointer(t)) HasBlockType = true; @@ -3812,10 +3808,8 @@ Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp, const Expr *BlockExp) { // Push the block argument type. ArgTypes.push_back(PtrBlock); if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I && (I != E); ++I) { - QualType t = *I; + for (auto &I : FTP->param_types()) { + QualType t = I; // Make sure we convert "t (^)(...)" to "t (*)(...)". if (!convertBlockPointerToFunctionPointer(t)) convertToUnqualifiedObjCType(t); @@ -4016,10 +4010,8 @@ bool RewriteObjC::PointerTypeTakesAnyBlockArguments(QualType QT) { FTP = BPT->getPointeeType()->getAs(); } if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I != E; ++I) - if (isTopLevelBlockPointerType(*I)) + for (const auto &I : FTP->param_types()) + if (isTopLevelBlockPointerType(I)) return true; } return false; @@ -4036,13 +4028,11 @@ bool RewriteObjC::PointerTypeTakesAnyObjCQualifiedType(QualType QT) { FTP = BPT->getPointeeType()->getAs(); } if (FTP) { - for (FunctionProtoType::param_type_iterator I = FTP->param_type_begin(), - E = FTP->param_type_end(); - I != E; ++I) { - if ((*I)->isObjCQualifiedIdType()) + for (const auto &I : FTP->param_types()) { + if (I->isObjCQualifiedIdType()) return true; - if ((*I)->isObjCObjectPointerType() && - (*I)->getPointeeType()->isObjCQualifiedInterfaceType()) + if (I->isObjCObjectPointerType() && + I->getPointeeType()->isObjCQualifiedInterfaceType()) return true; } diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index f4e0df6d0a..58fe7227d2 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2649,8 +2649,7 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, // The old declaration provided a function prototype, but the // new declaration does not. Merge in the prototype. assert(!OldProto->hasExceptionSpec() && "Exception spec in C"); - SmallVector ParamTypes(OldProto->param_type_begin(), - OldProto->param_type_end()); + SmallVector ParamTypes(OldProto->param_types()); NewQType = Context.getFunctionType(NewFuncType->getReturnType(), ParamTypes, OldProto->getExtProtoInfo()); @@ -2659,16 +2658,10 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, // Synthesize a parameter for each argument type. SmallVector Params; - for (FunctionProtoType::param_type_iterator - ParamType = OldProto->param_type_begin(), - ParamEnd = OldProto->param_type_end(); - ParamType != ParamEnd; ++ParamType) { - ParmVarDecl *Param = ParmVarDecl::Create(Context, New, - SourceLocation(), - SourceLocation(), 0, - *ParamType, /*TInfo=*/0, - SC_None, - 0); + for (const auto &ParamType : OldProto->param_types()) { + ParmVarDecl *Param = ParmVarDecl::Create(Context, New, SourceLocation(), + SourceLocation(), 0, ParamType, + /*TInfo=*/0, SC_None, 0); Param->setScopeInfo(0, Params.size()); Param->setImplicit(); Params.push_back(Param); @@ -6909,11 +6902,9 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, // @endcode // Synthesize a parameter for each argument type. - for (FunctionProtoType::param_type_iterator AI = FT->param_type_begin(), - AE = FT->param_type_end(); - AI != AE; ++AI) { + for (const auto &AI : FT->param_types()) { ParmVarDecl *Param = - BuildParmVarDeclForTypedef(NewFD, D.getIdentifierLoc(), *AI); + BuildParmVarDeclForTypedef(NewFD, D.getIdentifierLoc(), AI); Param->setScopeInfo(0, Params.size()); Params.push_back(Param); } diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 38158eb133..26d7ae9667 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -4611,10 +4611,8 @@ NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II, QualType FDTy = FD->getType(); if (const FunctionProtoType *FT = FDTy->getAs()) { SmallVector Params; - for (FunctionProtoType::param_type_iterator AI = FT->param_type_begin(), - AE = FT->param_type_end(); - AI != AE; ++AI) { - ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, *AI); + for (const auto &AI : FT->param_types()) { + ParmVarDecl *Param = BuildParmVarDeclForTypedef(NewFD, Loc, AI); Param->setScopeInfo(0, Params.size()); Params.push_back(Param); } diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 72ac597b15..80220c0d14 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -10419,13 +10419,9 @@ void Sema::ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, // Fake up parameter variables if we have a typedef, like // ^ fntype { ... } } else if (const FunctionProtoType *Fn = T->getAs()) { - for (FunctionProtoType::param_type_iterator I = Fn->param_type_begin(), - E = Fn->param_type_end(); - I != E; ++I) { - ParmVarDecl *Param = - BuildParmVarDeclForTypedef(CurBlock->TheDecl, - ParamInfo.getLocStart(), - *I); + for (const auto &I : Fn->param_types()) { + ParmVarDecl *Param = BuildParmVarDeclForTypedef( + CurBlock->TheDecl, ParamInfo.getLocStart(), I); Params.push_back(Param); } } diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 7ac10d38eb..8495c97e4e 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -2180,11 +2180,8 @@ addAssociatedClassesAndNamespaces(AssociatedLookup &Result, QualType Ty) { // types and those associated with the return type. case Type::FunctionProto: { const FunctionProtoType *Proto = cast(T); - for (FunctionProtoType::param_type_iterator - Arg = Proto->param_type_begin(), - ArgEnd = Proto->param_type_end(); - Arg != ArgEnd; ++Arg) - Queue.push_back(Arg->getTypePtr()); + for (const auto &Arg : Proto->param_types()) + Queue.push_back(Arg.getTypePtr()); // fallthrough } case Type::FunctionNoProto: { diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index aacb0b6eea..2b88bf9bf0 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -3912,10 +3912,8 @@ bool UnnamedLocalNoLinkageFinder::VisitExtVectorType(const ExtVectorType* T) { bool UnnamedLocalNoLinkageFinder::VisitFunctionProtoType( const FunctionProtoType* T) { - for (FunctionProtoType::param_type_iterator A = T->param_type_begin(), - AEnd = T->param_type_end(); - A != AEnd; ++A) { - if (Visit(*A)) + for (const auto &A : T->param_types()) { + if (Visit(A)) return true; }