diff --git a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptx86ABIFixups.cpp b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptx86ABIFixups.cpp --- a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptx86ABIFixups.cpp +++ b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptx86ABIFixups.cpp @@ -237,8 +237,7 @@ llvm::AttributeList call_attribs = call_inst->getAttributes(); // iterate over the argument attributes - for (unsigned I = call_attribs.index_begin(); I != call_attribs.index_end(); - I++) { + for (unsigned I : call_attribs.indexes()) { // if this argument is passed by val if (call_attribs.hasAttributeAtIndex(I, llvm::Attribute::ByVal)) { // strip away the byval attribute diff --git a/llvm/include/llvm/IR/Attributes.h b/llvm/include/llvm/IR/Attributes.h --- a/llvm/include/llvm/IR/Attributes.h +++ b/llvm/include/llvm/IR/Attributes.h @@ -851,9 +851,32 @@ unsigned getNumAttrSets() const; - /// Use these to iterate over the valid attribute indices. - unsigned index_begin() const { return AttributeList::FunctionIndex; } - unsigned index_end() const { return getNumAttrSets() - 1; } + // Implementation of indexes(). Produces iterators that wrap an index. Mostly + // to hide the awkwardness of unsigned wrapping when iterating over valid + // indexes. + struct index_iterator { + unsigned NumAttrSets; + index_iterator(int NumAttrSets) : NumAttrSets(NumAttrSets) {} + struct int_wrapper { + int_wrapper(unsigned i) : i(i) {} + unsigned i; + unsigned operator*() { return i; } + bool operator!=(const int_wrapper &Other) { return i != Other.i; } + int_wrapper &operator++() { + // This is expected to undergo unsigned wrapping since FunctionIndex is + // ~0 and that's where we start. + ++i; + return *this; + } + }; + + int_wrapper begin() { return int_wrapper(AttributeList::FunctionIndex); } + + int_wrapper end() { return int_wrapper(NumAttrSets - 1); } + }; + + /// Use this to iterate over the valid attribute indexes. + index_iterator indexes() const { return index_iterator(getNumAttrSets()); } /// operator==/!= - Provide equality predicates. bool operator==(const AttributeList &RHS) const { return pImpl == RHS.pImpl; } diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -835,7 +835,7 @@ SmallVector Record; for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { AttributeList AL = Attrs[i]; - for (unsigned i = AL.index_begin(), e = AL.index_end(); i != e; ++i) { + for (unsigned i : AL.indexes()) { AttributeSet AS = AL.getAttributes(i); if (AS.hasAttributes()) Record.push_back(VE.getAttributeGroupID({i, AS})); diff --git a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp --- a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -1039,7 +1039,7 @@ } // Do lookups for all attribute groups. - for (unsigned i = PAL.index_begin(), e = PAL.index_end(); i != e; ++i) { + for (unsigned i : PAL.indexes()) { AttributeSet AS = PAL.getAttributes(i); if (!AS.hasAttributes()) continue; diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -1527,7 +1527,7 @@ void AttributeList::print(raw_ostream &O) const { O << "AttributeList[\n"; - for (unsigned i = index_begin(), e = index_end(); i != e; ++i) { + for (unsigned i : indexes()) { if (!getAttributes(i).hasAttributes()) continue; O << " { "; diff --git a/llvm/lib/Transforms/Utils/FunctionComparator.cpp b/llvm/lib/Transforms/Utils/FunctionComparator.cpp --- a/llvm/lib/Transforms/Utils/FunctionComparator.cpp +++ b/llvm/lib/Transforms/Utils/FunctionComparator.cpp @@ -110,7 +110,7 @@ if (int Res = cmpNumbers(L.getNumAttrSets(), R.getNumAttrSets())) return Res; - for (unsigned i = L.index_begin(), e = L.index_end(); i != e; ++i) { + for (unsigned i : L.indexes()) { AttributeSet LAS = L.getAttributes(i); AttributeSet RAS = R.getAttributes(i); AttributeSet::iterator LI = LAS.begin(), LE = LAS.end(); diff --git a/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp b/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp --- a/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceAttributes.cpp @@ -84,8 +84,7 @@ AttrPtrVecVecTy &AttributeSetsToPreserve) { assert(AttributeSetsToPreserve.empty() && "Should not be sharing vectors."); AttributeSetsToPreserve.reserve(AL.getNumAttrSets()); - for (unsigned SetIdx = AL.index_begin(), SetEndIdx = AL.index_end(); - SetIdx != SetEndIdx; ++SetIdx) { + for (unsigned SetIdx : AL.indexes()) { AttrPtrIdxVecVecTy AttributesToPreserve; AttributesToPreserve.first = SetIdx; visitAttributeSet(AL.getAttributes(AttributesToPreserve.first),