forked from OSchip/llvm-project
Update APIs that return a pair of iterators to return an iterator_range instead.
Convert uses of those APIs into ranged for loops. NFC. llvm-svn: 228404
This commit is contained in:
parent
808141c2af
commit
b4ef66832d
|
@ -1093,8 +1093,7 @@ public:
|
|||
|
||||
/// \brief Get all conversion functions visible in current class,
|
||||
/// including conversion function templates.
|
||||
std::pair<conversion_iterator, conversion_iterator>
|
||||
getVisibleConversionFunctions();
|
||||
llvm::iterator_range<conversion_iterator> getVisibleConversionFunctions();
|
||||
|
||||
/// Determine whether this class is an aggregate (C++ [dcl.init.aggr]),
|
||||
/// which is a class with no user-declared constructors, no private
|
||||
|
|
|
@ -173,8 +173,8 @@ public:
|
|||
|
||||
typedef const VarDecl * const * referenced_decls_iterator;
|
||||
|
||||
std::pair<referenced_decls_iterator, referenced_decls_iterator>
|
||||
getReferencedBlockVars(const BlockDecl *BD);
|
||||
llvm::iterator_range<referenced_decls_iterator>
|
||||
getReferencedBlockVars(const BlockDecl *BD);
|
||||
|
||||
/// Return the ImplicitParamDecl* associated with 'self' if this
|
||||
/// AnalysisDeclContext wraps an ObjCMethodDecl. Returns NULL otherwise.
|
||||
|
|
|
@ -675,8 +675,8 @@ public:
|
|||
/// \brief Returns an iterator range for the local preprocessing entities
|
||||
/// of the local Preprocessor, if this is a parsed source file, or the loaded
|
||||
/// preprocessing entities of the primary module if this is an AST file.
|
||||
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
|
||||
getLocalPreprocessingEntities() const;
|
||||
llvm::iterator_range<PreprocessingRecord::iterator>
|
||||
getLocalPreprocessingEntities() const;
|
||||
|
||||
/// \brief Type for a function iterating over a number of declarations.
|
||||
/// \returns true to continue iteration and false to abort.
|
||||
|
|
|
@ -518,23 +518,24 @@ namespace clang {
|
|||
return iterator(this, PreprocessedEntities.size());
|
||||
}
|
||||
|
||||
/// \brief begin/end iterator pair for the given range of loaded
|
||||
/// \brief iterator range for the given range of loaded
|
||||
/// preprocessed entities.
|
||||
std::pair<iterator, iterator>
|
||||
getIteratorsForLoadedRange(unsigned start, unsigned count) {
|
||||
llvm::iterator_range<iterator> getIteratorsForLoadedRange(unsigned start,
|
||||
unsigned count) {
|
||||
unsigned end = start + count;
|
||||
assert(end <= LoadedPreprocessedEntities.size());
|
||||
return std::make_pair(
|
||||
iterator(this, int(start)-LoadedPreprocessedEntities.size()),
|
||||
iterator(this, int(end)-LoadedPreprocessedEntities.size()));
|
||||
return llvm::make_range(
|
||||
iterator(this, int(start) - LoadedPreprocessedEntities.size()),
|
||||
iterator(this, int(end) - LoadedPreprocessedEntities.size()));
|
||||
}
|
||||
|
||||
/// \brief Returns a pair of [Begin, End) iterators of preprocessed entities
|
||||
/// that source range \p R encompasses.
|
||||
/// \brief Returns a range of preprocessed entities that source range \p R
|
||||
/// encompasses.
|
||||
///
|
||||
/// \param R the range to look for preprocessed entities.
|
||||
///
|
||||
std::pair<iterator, iterator> getPreprocessedEntitiesInRange(SourceRange R);
|
||||
llvm::iterator_range<iterator>
|
||||
getPreprocessedEntitiesInRange(SourceRange R);
|
||||
|
||||
/// \brief Returns true if the preprocessed entity that \p PPEI iterator
|
||||
/// points to is coming from the file \p FID.
|
||||
|
|
|
@ -1218,66 +1218,38 @@ private:
|
|||
|
||||
/// \brief Returns (begin, end) pair for the preprocessed entities of a
|
||||
/// particular module.
|
||||
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
|
||||
getModulePreprocessedEntities(ModuleFile &Mod) const;
|
||||
llvm::iterator_range<PreprocessingRecord::iterator>
|
||||
getModulePreprocessedEntities(ModuleFile &Mod) const;
|
||||
|
||||
class ModuleDeclIterator {
|
||||
class ModuleDeclIterator
|
||||
: public llvm::iterator_adaptor_base<
|
||||
ModuleDeclIterator, const serialization::LocalDeclID *,
|
||||
std::random_access_iterator_tag, const Decl *, ptrdiff_t,
|
||||
const Decl *, const Decl *> {
|
||||
ASTReader *Reader;
|
||||
ModuleFile *Mod;
|
||||
const serialization::LocalDeclID *Pos;
|
||||
|
||||
public:
|
||||
typedef const Decl *value_type;
|
||||
typedef value_type& reference;
|
||||
typedef value_type* pointer;
|
||||
|
||||
ModuleDeclIterator() : Reader(nullptr), Mod(nullptr), Pos(nullptr) { }
|
||||
ModuleDeclIterator()
|
||||
: iterator_adaptor_base(nullptr), Reader(nullptr), Mod(nullptr) {}
|
||||
|
||||
ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod,
|
||||
const serialization::LocalDeclID *Pos)
|
||||
: Reader(Reader), Mod(Mod), Pos(Pos) { }
|
||||
: iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {}
|
||||
|
||||
value_type operator*() const {
|
||||
return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, *Pos));
|
||||
return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, *I));
|
||||
}
|
||||
value_type operator->() const { return **this; }
|
||||
|
||||
ModuleDeclIterator &operator++() {
|
||||
++Pos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ModuleDeclIterator operator++(int) {
|
||||
ModuleDeclIterator Prev(*this);
|
||||
++Pos;
|
||||
return Prev;
|
||||
}
|
||||
|
||||
ModuleDeclIterator &operator--() {
|
||||
--Pos;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ModuleDeclIterator operator--(int) {
|
||||
ModuleDeclIterator Prev(*this);
|
||||
--Pos;
|
||||
return Prev;
|
||||
}
|
||||
|
||||
friend bool operator==(const ModuleDeclIterator &LHS,
|
||||
const ModuleDeclIterator &RHS) {
|
||||
assert(LHS.Reader == RHS.Reader && LHS.Mod == RHS.Mod);
|
||||
return LHS.Pos == RHS.Pos;
|
||||
}
|
||||
|
||||
friend bool operator!=(const ModuleDeclIterator &LHS,
|
||||
const ModuleDeclIterator &RHS) {
|
||||
assert(LHS.Reader == RHS.Reader && LHS.Mod == RHS.Mod);
|
||||
return LHS.Pos != RHS.Pos;
|
||||
bool operator==(const ModuleDeclIterator &RHS) const {
|
||||
assert(Reader == RHS.Reader && Mod == RHS.Mod);
|
||||
return I == RHS.I;
|
||||
}
|
||||
};
|
||||
|
||||
std::pair<ModuleDeclIterator, ModuleDeclIterator>
|
||||
getModuleFileLevelDecls(ModuleFile &Mod);
|
||||
llvm::iterator_range<ModuleDeclIterator>
|
||||
getModuleFileLevelDecls(ModuleFile &Mod);
|
||||
|
||||
void PassInterestingDeclsToConsumer();
|
||||
void PassInterestingDeclToConsumer(Decl *D);
|
||||
|
|
|
@ -290,7 +290,7 @@ public:
|
|||
}
|
||||
|
||||
/// \brief Get the SourceRanges associated with the report.
|
||||
virtual std::pair<ranges_iterator, ranges_iterator> getRanges();
|
||||
virtual llvm::iterator_range<ranges_iterator> getRanges();
|
||||
|
||||
/// \brief Add custom or predefined bug report visitors to this report.
|
||||
///
|
||||
|
|
|
@ -569,18 +569,14 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD,
|
|||
// overrider. To do so, we dig down to the original virtual
|
||||
// functions using data recursion and update all of the methods it
|
||||
// overrides.
|
||||
typedef std::pair<CXXMethodDecl::method_iterator,
|
||||
CXXMethodDecl::method_iterator> OverriddenMethods;
|
||||
typedef llvm::iterator_range<CXXMethodDecl::method_iterator>
|
||||
OverriddenMethods;
|
||||
SmallVector<OverriddenMethods, 4> Stack;
|
||||
Stack.push_back(std::make_pair(CanonM->begin_overridden_methods(),
|
||||
CanonM->end_overridden_methods()));
|
||||
Stack.push_back(llvm::make_range(CanonM->begin_overridden_methods(),
|
||||
CanonM->end_overridden_methods()));
|
||||
while (!Stack.empty()) {
|
||||
OverriddenMethods OverMethods = Stack.back();
|
||||
Stack.pop_back();
|
||||
|
||||
for (; OverMethods.first != OverMethods.second; ++OverMethods.first) {
|
||||
const CXXMethodDecl *CanonOM
|
||||
= cast<CXXMethodDecl>((*OverMethods.first)->getCanonicalDecl());
|
||||
for (const CXXMethodDecl *OM : Stack.pop_back_val()) {
|
||||
const CXXMethodDecl *CanonOM = OM->getCanonicalDecl();
|
||||
|
||||
// C++ [class.virtual]p2:
|
||||
// A virtual member function C::vf of a class object S is
|
||||
|
@ -601,8 +597,8 @@ void FinalOverriderCollector::Collect(const CXXRecordDecl *RD,
|
|||
|
||||
// Continue recursion to the methods that this virtual method
|
||||
// overrides.
|
||||
Stack.push_back(std::make_pair(CanonOM->begin_overridden_methods(),
|
||||
CanonOM->end_overridden_methods()));
|
||||
Stack.push_back(llvm::make_range(CanonOM->begin_overridden_methods(),
|
||||
CanonOM->end_overridden_methods()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1173,7 +1173,7 @@ static void CollectVisibleConversions(ASTContext &Context,
|
|||
|
||||
/// getVisibleConversionFunctions - get all conversion functions visible
|
||||
/// in current class; including conversion function templates.
|
||||
std::pair<CXXRecordDecl::conversion_iterator,CXXRecordDecl::conversion_iterator>
|
||||
llvm::iterator_range<CXXRecordDecl::conversion_iterator>
|
||||
CXXRecordDecl::getVisibleConversionFunctions() {
|
||||
ASTContext &Ctx = getASTContext();
|
||||
|
||||
|
@ -1189,7 +1189,7 @@ CXXRecordDecl::getVisibleConversionFunctions() {
|
|||
data().ComputedVisibleConversions = true;
|
||||
}
|
||||
}
|
||||
return std::make_pair(Set->begin(), Set->end());
|
||||
return llvm::make_range(Set->begin(), Set->end());
|
||||
}
|
||||
|
||||
void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
|
||||
|
|
|
@ -530,14 +530,14 @@ static DeclVec* LazyInitializeReferencedDecls(const BlockDecl *BD,
|
|||
return BV;
|
||||
}
|
||||
|
||||
std::pair<AnalysisDeclContext::referenced_decls_iterator,
|
||||
AnalysisDeclContext::referenced_decls_iterator>
|
||||
llvm::iterator_range<AnalysisDeclContext::referenced_decls_iterator>
|
||||
AnalysisDeclContext::getReferencedBlockVars(const BlockDecl *BD) {
|
||||
if (!ReferencedBlockVars)
|
||||
ReferencedBlockVars = new llvm::DenseMap<const BlockDecl*,void*>();
|
||||
|
||||
DeclVec *V = LazyInitializeReferencedDecls(BD, (*ReferencedBlockVars)[BD], A);
|
||||
return std::make_pair(V->begin(), V->end());
|
||||
const DeclVec *V =
|
||||
LazyInitializeReferencedDecls(BD, (*ReferencedBlockVars)[BD], A);
|
||||
return llvm::make_range(V->begin(), V->end());
|
||||
}
|
||||
|
||||
ManagedAnalysis *&AnalysisDeclContext::getAnalysisImpl(const void *tag) {
|
||||
|
|
|
@ -356,11 +356,8 @@ void TransferFunctions::VisitBinaryOperator(BinaryOperator *B) {
|
|||
}
|
||||
|
||||
void TransferFunctions::VisitBlockExpr(BlockExpr *BE) {
|
||||
AnalysisDeclContext::referenced_decls_iterator I, E;
|
||||
std::tie(I, E) =
|
||||
LV.analysisContext.getReferencedBlockVars(BE->getBlockDecl());
|
||||
for ( ; I != E ; ++I) {
|
||||
const VarDecl *VD = *I;
|
||||
for (const VarDecl *VD :
|
||||
LV.analysisContext.getReferencedBlockVars(BE->getBlockDecl())) {
|
||||
if (isAlwaysAlive(VD))
|
||||
continue;
|
||||
val.liveDecls = LV.DSetFact.add(val.liveDecls, VD);
|
||||
|
|
|
@ -2736,7 +2736,7 @@ SourceLocation ASTUnit::getStartOfMainFileID() {
|
|||
return SourceMgr->getLocForStartOfFile(FID);
|
||||
}
|
||||
|
||||
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
|
||||
llvm::iterator_range<PreprocessingRecord::iterator>
|
||||
ASTUnit::getLocalPreprocessingEntities() const {
|
||||
if (isMainFileAST()) {
|
||||
serialization::ModuleFile &
|
||||
|
@ -2745,20 +2745,18 @@ ASTUnit::getLocalPreprocessingEntities() const {
|
|||
}
|
||||
|
||||
if (PreprocessingRecord *PPRec = PP->getPreprocessingRecord())
|
||||
return std::make_pair(PPRec->local_begin(), PPRec->local_end());
|
||||
return llvm::make_range(PPRec->local_begin(), PPRec->local_end());
|
||||
|
||||
return std::make_pair(PreprocessingRecord::iterator(),
|
||||
PreprocessingRecord::iterator());
|
||||
return llvm::make_range(PreprocessingRecord::iterator(),
|
||||
PreprocessingRecord::iterator());
|
||||
}
|
||||
|
||||
bool ASTUnit::visitLocalTopLevelDecls(void *context, DeclVisitorFn Fn) {
|
||||
if (isMainFileAST()) {
|
||||
serialization::ModuleFile &
|
||||
Mod = Reader->getModuleManager().getPrimaryModule();
|
||||
ASTReader::ModuleDeclIterator MDI, MDE;
|
||||
std::tie(MDI, MDE) = Reader->getModuleFileLevelDecls(Mod);
|
||||
for (; MDI != MDE; ++MDI) {
|
||||
if (!Fn(context, *MDI))
|
||||
for (const Decl *D : Reader->getModuleFileLevelDecls(Mod)) {
|
||||
if (!Fn(context, D))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,22 +45,23 @@ PreprocessingRecord::PreprocessingRecord(SourceManager &SM)
|
|||
|
||||
/// \brief Returns a pair of [Begin, End) iterators of preprocessed entities
|
||||
/// that source range \p Range encompasses.
|
||||
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
|
||||
llvm::iterator_range<PreprocessingRecord::iterator>
|
||||
PreprocessingRecord::getPreprocessedEntitiesInRange(SourceRange Range) {
|
||||
if (Range.isInvalid())
|
||||
return std::make_pair(iterator(), iterator());
|
||||
return llvm::make_range(iterator(), iterator());
|
||||
|
||||
if (CachedRangeQuery.Range == Range) {
|
||||
return std::make_pair(iterator(this, CachedRangeQuery.Result.first),
|
||||
iterator(this, CachedRangeQuery.Result.second));
|
||||
return llvm::make_range(iterator(this, CachedRangeQuery.Result.first),
|
||||
iterator(this, CachedRangeQuery.Result.second));
|
||||
}
|
||||
|
||||
std::pair<int, int> Res = getPreprocessedEntitiesInRangeSlow(Range);
|
||||
|
||||
CachedRangeQuery.Range = Range;
|
||||
CachedRangeQuery.Result = Res;
|
||||
|
||||
return std::make_pair(iterator(this, Res.first), iterator(this, Res.second));
|
||||
|
||||
return llvm::make_range(iterator(this, Res.first),
|
||||
iterator(this, Res.second));
|
||||
}
|
||||
|
||||
static bool isPreprocessedEntityIfInFileID(PreprocessedEntity *PPE, FileID FID,
|
||||
|
|
|
@ -3634,11 +3634,8 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
|
|||
// functions.
|
||||
CXXRecordDecl *T2RecordDecl = cast<CXXRecordDecl>(T2RecordType->getDecl());
|
||||
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator>
|
||||
Conversions = T2RecordDecl->getVisibleConversionFunctions();
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
|
||||
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
|
||||
NamedDecl *D = *I;
|
||||
CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
|
||||
if (isa<UsingShadowDecl>(D))
|
||||
|
@ -4266,11 +4263,9 @@ static void TryUserDefinedConversion(Sema &S,
|
|||
CXXRecordDecl *SourceRecordDecl
|
||||
= cast<CXXRecordDecl>(SourceRecordType->getDecl());
|
||||
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator>
|
||||
Conversions = SourceRecordDecl->getVisibleConversionFunctions();
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
const auto &Conversions =
|
||||
SourceRecordDecl->getVisibleConversionFunctions();
|
||||
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
|
||||
NamedDecl *D = *I;
|
||||
CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
|
||||
if (isa<UsingShadowDecl>(D))
|
||||
|
|
|
@ -194,10 +194,11 @@ namespace {
|
|||
const_iterator begin() const { return list.begin(); }
|
||||
const_iterator end() const { return list.end(); }
|
||||
|
||||
std::pair<const_iterator,const_iterator>
|
||||
llvm::iterator_range<const_iterator>
|
||||
getNamespacesFor(DeclContext *DC) const {
|
||||
return std::equal_range(begin(), end(), DC->getPrimaryContext(),
|
||||
UnqualUsingEntry::Comparator());
|
||||
return llvm::make_range(std::equal_range(begin(), end(),
|
||||
DC->getPrimaryContext(),
|
||||
UnqualUsingEntry::Comparator()));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -765,11 +766,8 @@ CppNamespaceLookup(Sema &S, LookupResult &R, ASTContext &Context,
|
|||
|
||||
// Perform direct name lookup into the namespaces nominated by the
|
||||
// using directives whose common ancestor is this namespace.
|
||||
UnqualUsingDirectiveSet::const_iterator UI, UEnd;
|
||||
std::tie(UI, UEnd) = UDirs.getNamespacesFor(NS);
|
||||
|
||||
for (; UI != UEnd; ++UI)
|
||||
if (LookupDirect(S, R, UI->getNominatedNamespace()))
|
||||
for (const UnqualUsingEntry &UUE : UDirs.getNamespacesFor(NS))
|
||||
if (LookupDirect(S, R, UUE.getNominatedNamespace()))
|
||||
Found = true;
|
||||
|
||||
R.resolveKind();
|
||||
|
@ -3199,10 +3197,8 @@ static void LookupVisibleDecls(Scope *S, LookupResult &Result,
|
|||
if (Entity) {
|
||||
// Lookup visible declarations in any namespaces found by using
|
||||
// directives.
|
||||
UnqualUsingDirectiveSet::const_iterator UI, UEnd;
|
||||
std::tie(UI, UEnd) = UDirs.getNamespacesFor(Entity);
|
||||
for (; UI != UEnd; ++UI)
|
||||
LookupVisibleDecls(const_cast<DeclContext *>(UI->getNominatedNamespace()),
|
||||
for (const UnqualUsingEntry &UUE : UDirs.getNamespacesFor(Entity))
|
||||
LookupVisibleDecls(const_cast<DeclContext *>(UUE.getNominatedNamespace()),
|
||||
Result, /*QualifiedNameLookup=*/false,
|
||||
/*InBaseClass=*/false, Consumer, Visited);
|
||||
}
|
||||
|
|
|
@ -3099,11 +3099,8 @@ IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
|
|||
if (CXXRecordDecl *FromRecordDecl
|
||||
= dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
|
||||
// Add all of the conversion functions as candidates.
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator>
|
||||
Conversions = FromRecordDecl->getVisibleConversionFunctions();
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
const auto &Conversions = FromRecordDecl->getVisibleConversionFunctions();
|
||||
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
|
||||
DeclAccessPair FoundDecl = I.getPair();
|
||||
NamedDecl *D = FoundDecl.getDecl();
|
||||
CXXRecordDecl *ActingContext = cast<CXXRecordDecl>(D->getDeclContext());
|
||||
|
@ -4045,11 +4042,8 @@ FindConversionForRefInit(Sema &S, ImplicitConversionSequence &ICS,
|
|||
= dyn_cast<CXXRecordDecl>(T2->getAs<RecordType>()->getDecl());
|
||||
|
||||
OverloadCandidateSet CandidateSet(DeclLoc, OverloadCandidateSet::CSK_Normal);
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator>
|
||||
Conversions = T2RecordDecl->getVisibleConversionFunctions();
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
const auto &Conversions = T2RecordDecl->getVisibleConversionFunctions();
|
||||
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
|
||||
NamedDecl *D = *I;
|
||||
CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
|
||||
if (isa<UsingShadowDecl>(D))
|
||||
|
@ -5399,21 +5393,18 @@ ExprResult Sema::PerformContextualImplicitConversion(
|
|||
UnresolvedSet<4>
|
||||
ViableConversions; // These are *potentially* viable in C++1y.
|
||||
UnresolvedSet<4> ExplicitConversions;
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator> Conversions =
|
||||
const auto &Conversions =
|
||||
cast<CXXRecordDecl>(RecordTy->getDecl())->getVisibleConversionFunctions();
|
||||
|
||||
bool HadMultipleCandidates =
|
||||
(std::distance(Conversions.first, Conversions.second) > 1);
|
||||
(std::distance(Conversions.begin(), Conversions.end()) > 1);
|
||||
|
||||
// To check that there is only one target type, in C++1y:
|
||||
QualType ToType;
|
||||
bool HasUniqueTargetType = true;
|
||||
|
||||
// Collect explicit or viable (potentially in C++1y) conversions.
|
||||
for (CXXRecordDecl::conversion_iterator I = Conversions.first,
|
||||
E = Conversions.second;
|
||||
I != E; ++I) {
|
||||
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
|
||||
NamedDecl *D = (*I)->getUnderlyingDecl();
|
||||
CXXConversionDecl *Conversion;
|
||||
FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
|
||||
|
@ -6944,12 +6935,7 @@ BuiltinCandidateTypeSet::AddTypesConvertedFrom(QualType Ty,
|
|||
return;
|
||||
|
||||
CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(TyRec->getDecl());
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator>
|
||||
Conversions = ClassDecl->getVisibleConversionFunctions();
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
NamedDecl *D = I.getDecl();
|
||||
for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
|
||||
if (isa<UsingShadowDecl>(D))
|
||||
D = cast<UsingShadowDecl>(D)->getTargetDecl();
|
||||
|
||||
|
@ -7013,13 +6999,7 @@ static Qualifiers CollectVRQualifiers(ASTContext &Context, Expr* ArgExpr) {
|
|||
if (!ClassDecl->hasDefinition())
|
||||
return VRQuals;
|
||||
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator>
|
||||
Conversions = ClassDecl->getVisibleConversionFunctions();
|
||||
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
NamedDecl *D = I.getDecl();
|
||||
for (NamedDecl *D : ClassDecl->getVisibleConversionFunctions()) {
|
||||
if (isa<UsingShadowDecl>(D))
|
||||
D = cast<UsingShadowDecl>(D)->getTargetDecl();
|
||||
if (CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(D)) {
|
||||
|
@ -11868,11 +11848,9 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj,
|
|||
// functions for each conversion function declared in an
|
||||
// accessible base class provided the function is not hidden
|
||||
// within T by another intervening declaration.
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator> Conversions
|
||||
= cast<CXXRecordDecl>(Record->getDecl())->getVisibleConversionFunctions();
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
const auto &Conversions =
|
||||
cast<CXXRecordDecl>(Record->getDecl())->getVisibleConversionFunctions();
|
||||
for (auto I = Conversions.begin(), E = Conversions.end(); I != E; ++I) {
|
||||
NamedDecl *D = *I;
|
||||
CXXRecordDecl *ActingContext = cast<CXXRecordDecl>(D->getDeclContext());
|
||||
if (isa<UsingShadowDecl>(D))
|
||||
|
|
|
@ -1051,17 +1051,13 @@ Sema::ObjCSubscriptKind
|
|||
|
||||
// Look for a conversion to an integral, enumeration type, or
|
||||
// objective-C pointer type.
|
||||
std::pair<CXXRecordDecl::conversion_iterator,
|
||||
CXXRecordDecl::conversion_iterator> Conversions
|
||||
= cast<CXXRecordDecl>(RecordTy->getDecl())->getVisibleConversionFunctions();
|
||||
|
||||
int NoIntegrals=0, NoObjCIdPointers=0;
|
||||
SmallVector<CXXConversionDecl *, 4> ConversionDecls;
|
||||
|
||||
for (CXXRecordDecl::conversion_iterator
|
||||
I = Conversions.first, E = Conversions.second; I != E; ++I) {
|
||||
if (CXXConversionDecl *Conversion
|
||||
= dyn_cast<CXXConversionDecl>((*I)->getUnderlyingDecl())) {
|
||||
|
||||
for (NamedDecl *D : cast<CXXRecordDecl>(RecordTy->getDecl())
|
||||
->getVisibleConversionFunctions()) {
|
||||
if (CXXConversionDecl *Conversion =
|
||||
dyn_cast<CXXConversionDecl>(D->getUnderlyingDecl())) {
|
||||
QualType CT = Conversion->getConversionType().getNonReferenceType();
|
||||
if (CT->isIntegralOrEnumerationType()) {
|
||||
++NoIntegrals;
|
||||
|
|
|
@ -4823,21 +4823,22 @@ ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) {
|
|||
return std::make_pair(M, LocalIndex);
|
||||
}
|
||||
|
||||
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
|
||||
llvm::iterator_range<PreprocessingRecord::iterator>
|
||||
ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const {
|
||||
if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
|
||||
return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID,
|
||||
Mod.NumPreprocessedEntities);
|
||||
|
||||
return std::make_pair(PreprocessingRecord::iterator(),
|
||||
PreprocessingRecord::iterator());
|
||||
return llvm::make_range(PreprocessingRecord::iterator(),
|
||||
PreprocessingRecord::iterator());
|
||||
}
|
||||
|
||||
std::pair<ASTReader::ModuleDeclIterator, ASTReader::ModuleDeclIterator>
|
||||
llvm::iterator_range<ASTReader::ModuleDeclIterator>
|
||||
ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) {
|
||||
return std::make_pair(ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
|
||||
ModuleDeclIterator(this, &Mod,
|
||||
Mod.FileSortedDecls + Mod.NumFileSortedDecls));
|
||||
return llvm::make_range(
|
||||
ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls),
|
||||
ModuleDeclIterator(this, &Mod,
|
||||
Mod.FileSortedDecls + Mod.NumFileSortedDecls));
|
||||
}
|
||||
|
||||
PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) {
|
||||
|
|
|
@ -1788,12 +1788,11 @@ namespace {
|
|||
addGCModeDescription(LOpts, GCEnabled);
|
||||
}
|
||||
|
||||
std::pair<ranges_iterator, ranges_iterator> getRanges() override {
|
||||
llvm::iterator_range<ranges_iterator> getRanges() override {
|
||||
const CFRefBug& BugTy = static_cast<CFRefBug&>(getBugType());
|
||||
if (!BugTy.isLeak())
|
||||
return BugReport::getRanges();
|
||||
else
|
||||
return std::make_pair(ranges_iterator(), ranges_iterator());
|
||||
return llvm::make_range(ranges_iterator(), ranges_iterator());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -2702,22 +2702,22 @@ const Stmt *BugReport::getStmt() const {
|
|||
return S;
|
||||
}
|
||||
|
||||
std::pair<BugReport::ranges_iterator, BugReport::ranges_iterator>
|
||||
BugReport::getRanges() {
|
||||
// If no custom ranges, add the range of the statement corresponding to
|
||||
// the error node.
|
||||
if (Ranges.empty()) {
|
||||
if (const Expr *E = dyn_cast_or_null<Expr>(getStmt()))
|
||||
addRange(E->getSourceRange());
|
||||
else
|
||||
return std::make_pair(ranges_iterator(), ranges_iterator());
|
||||
}
|
||||
llvm::iterator_range<BugReport::ranges_iterator> BugReport::getRanges() {
|
||||
// If no custom ranges, add the range of the statement corresponding to
|
||||
// the error node.
|
||||
if (Ranges.empty()) {
|
||||
if (const Expr *E = dyn_cast_or_null<Expr>(getStmt()))
|
||||
addRange(E->getSourceRange());
|
||||
else
|
||||
return llvm::make_range(ranges_iterator(), ranges_iterator());
|
||||
}
|
||||
|
||||
// User-specified absence of range info.
|
||||
if (Ranges.size() == 1 && !Ranges.begin()->isValid())
|
||||
return std::make_pair(ranges_iterator(), ranges_iterator());
|
||||
// User-specified absence of range info.
|
||||
if (Ranges.size() == 1 && !Ranges.begin()->isValid())
|
||||
return llvm::make_range(ranges_iterator(), ranges_iterator());
|
||||
|
||||
return std::make_pair(Ranges.begin(), Ranges.end());
|
||||
return llvm::iterator_range<BugReport::ranges_iterator>(Ranges.begin(),
|
||||
Ranges.end());
|
||||
}
|
||||
|
||||
PathDiagnosticLocation BugReport::getLocation(const SourceManager &SM) const {
|
||||
|
@ -3434,10 +3434,8 @@ void BugReporter::FlushReport(BugReport *exampleReport,
|
|||
PathDiagnosticLocation L = exampleReport->getLocation(getSourceManager());
|
||||
auto piece = llvm::make_unique<PathDiagnosticEventPiece>(
|
||||
L, exampleReport->getDescription());
|
||||
BugReport::ranges_iterator Beg, End;
|
||||
std::tie(Beg, End) = exampleReport->getRanges();
|
||||
for ( ; Beg != End; ++Beg)
|
||||
piece->addRange(*Beg);
|
||||
for (const SourceRange &Range : exampleReport->getRanges())
|
||||
piece->addRange(Range);
|
||||
D->setEndOfPath(std::move(piece));
|
||||
}
|
||||
|
||||
|
|
|
@ -111,15 +111,14 @@ std::unique_ptr<PathDiagnosticPiece> BugReporterVisitor::getDefaultEndPath(
|
|||
PathDiagnosticLocation L =
|
||||
PathDiagnosticLocation::createEndOfPath(EndPathNode,BRC.getSourceManager());
|
||||
|
||||
BugReport::ranges_iterator Beg, End;
|
||||
std::tie(Beg, End) = BR.getRanges();
|
||||
const auto &Ranges = BR.getRanges();
|
||||
|
||||
// Only add the statement itself as a range if we didn't specify any
|
||||
// special ranges for this report.
|
||||
auto P = llvm::make_unique<PathDiagnosticEventPiece>(L, BR.getDescription(),
|
||||
Beg == End);
|
||||
for (; Beg != End; ++Beg)
|
||||
P->addRange(*Beg);
|
||||
auto P = llvm::make_unique<PathDiagnosticEventPiece>(
|
||||
L, BR.getDescription(), Ranges.begin() == Ranges.end());
|
||||
for (const SourceRange &Range : Ranges)
|
||||
P->addRange(Range);
|
||||
|
||||
return std::move(P);
|
||||
}
|
||||
|
|
|
@ -1372,10 +1372,11 @@ void BlockDataRegion::LazyInitializeReferencedVars() {
|
|||
return;
|
||||
|
||||
AnalysisDeclContext *AC = getCodeRegion()->getAnalysisDeclContext();
|
||||
AnalysisDeclContext::referenced_decls_iterator I, E;
|
||||
std::tie(I, E) = AC->getReferencedBlockVars(BC->getDecl());
|
||||
const auto &ReferencedBlockVars = AC->getReferencedBlockVars(BC->getDecl());
|
||||
auto NumBlockVars =
|
||||
std::distance(ReferencedBlockVars.begin(), ReferencedBlockVars.end());
|
||||
|
||||
if (I == E) {
|
||||
if (NumBlockVars == 0) {
|
||||
ReferencedVars = (void*) 0x1;
|
||||
return;
|
||||
}
|
||||
|
@ -1386,14 +1387,14 @@ void BlockDataRegion::LazyInitializeReferencedVars() {
|
|||
|
||||
typedef BumpVector<const MemRegion*> VarVec;
|
||||
VarVec *BV = (VarVec*) A.Allocate<VarVec>();
|
||||
new (BV) VarVec(BC, E - I);
|
||||
new (BV) VarVec(BC, NumBlockVars);
|
||||
VarVec *BVOriginal = (VarVec*) A.Allocate<VarVec>();
|
||||
new (BVOriginal) VarVec(BC, E - I);
|
||||
new (BVOriginal) VarVec(BC, NumBlockVars);
|
||||
|
||||
for ( ; I != E; ++I) {
|
||||
for (const VarDecl *VD : ReferencedBlockVars) {
|
||||
const VarRegion *VR = nullptr;
|
||||
const VarRegion *OriginalVR = nullptr;
|
||||
std::tie(VR, OriginalVR) = getCaptureRegions(*I);
|
||||
std::tie(VR, OriginalVR) = getCaptureRegions(VD);
|
||||
assert(VR);
|
||||
assert(OriginalVR);
|
||||
BV->push_back(VR, BC);
|
||||
|
|
|
@ -240,9 +240,8 @@ static bool visitPreprocessedEntitiesInRange(SourceRange R,
|
|||
FID = FileID();
|
||||
}
|
||||
|
||||
std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
|
||||
Entities = PPRec.getPreprocessedEntitiesInRange(R);
|
||||
return Visitor.visitPreprocessedEntities(Entities.first, Entities.second,
|
||||
const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R);
|
||||
return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(),
|
||||
PPRec, FID);
|
||||
}
|
||||
|
||||
|
|
|
@ -697,13 +697,8 @@ static void indexPreprocessingRecord(ASTUnit &Unit, IndexingContext &IdxCtx) {
|
|||
|
||||
// FIXME: Only deserialize inclusion directives.
|
||||
|
||||
PreprocessingRecord::iterator I, E;
|
||||
std::tie(I, E) = Unit.getLocalPreprocessingEntities();
|
||||
|
||||
bool isModuleFile = Unit.isModuleFile();
|
||||
for (; I != E; ++I) {
|
||||
PreprocessedEntity *PPE = *I;
|
||||
|
||||
for (PreprocessedEntity *PPE : Unit.getLocalPreprocessingEntities()) {
|
||||
if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) {
|
||||
SourceLocation Loc = ID->getSourceRange().getBegin();
|
||||
// Modules have synthetic main files as input, give an invalid location
|
||||
|
|
Loading…
Reference in New Issue