summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2014-03-06 01:51:01 +0000
committerOwen Anderson <resistor@mac.com>2014-03-06 01:51:01 +0000
commit907423f7db7b9537cc3101398fc981f140fef348 (patch)
treefbfa3b75d52603881bf5a66a3c430e42d84e8cca
parent4b2ab80c3ebd3bd8214ee0ca6d991d6c691c63a8 (diff)
downloadllvm-907423f7db7b9537cc3101398fc981f140fef348.tar.gz
llvm-907423f7db7b9537cc3101398fc981f140fef348.tar.bz2
llvm-907423f7db7b9537cc3101398fc981f140fef348.tar.xz
Fix issues in the NamedMDNode operand iterator, including those pointed out by
Chandler in review. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203058 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/IR/Metadata.h19
1 files changed, 11 insertions, 8 deletions
diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h
index 27f7fd935d..9992e5cbde 100644
--- a/include/llvm/IR/Metadata.h
+++ b/include/llvm/IR/Metadata.h
@@ -208,8 +208,9 @@ class NamedMDNode : public ilist_node<NamedMDNode> {
explicit NamedMDNode(const Twine &N);
- template<class T>
- class op_iterator_impl {
+ template<class T1, class T2>
+ class op_iterator_impl :
+ public std::iterator<std::random_access_iterator_tag, T2> {
const NamedMDNode *Node;
unsigned Idx;
op_iterator_impl(const NamedMDNode *N, unsigned i) : Node(N), Idx(i) { }
@@ -220,10 +221,11 @@ class NamedMDNode : public ilist_node<NamedMDNode> {
op_iterator_impl() : Node(0), Idx(0) { }
op_iterator_impl(const op_iterator_impl &o) : Node(o.Node), Idx(o.Idx) { }
- bool operator==(const op_iterator_impl<T> &o) const { return Idx == o.Idx; }
- bool operator!=(const op_iterator_impl<T> &o) const { return Idx != o.Idx; }
+ bool operator==(const op_iterator_impl &o) const { return Idx == o.Idx; }
+ bool operator!=(const op_iterator_impl &o) const { return Idx != o.Idx; }
op_iterator_impl &operator++() {
- ++Idx; return *this;
+ ++Idx;
+ return *this;
}
op_iterator_impl operator++(int) {
op_iterator_impl tmp(*this);
@@ -231,10 +233,11 @@ class NamedMDNode : public ilist_node<NamedMDNode> {
return tmp;
}
op_iterator_impl &operator=(const op_iterator_impl &o) {
+ Node = o.Node;
Idx = o.Idx;
return *this;
}
- T operator*() const { return Node->getOperand(Idx); }
+ T1 operator*() const { return Node->getOperand(Idx); }
};
public:
@@ -273,11 +276,11 @@ public:
// ---------------------------------------------------------------------------
// Operand Iterator interface...
//
- typedef op_iterator_impl<MDNode*> op_iterator;
+ typedef op_iterator_impl<MDNode*, MDNode> op_iterator;
op_iterator op_begin() { return op_iterator(this, 0); }
op_iterator op_end() { return op_iterator(this, getNumOperands()); }
- typedef op_iterator_impl<const MDNode*> const_op_iterator;
+ typedef op_iterator_impl<const MDNode*, MDNode> const_op_iterator;
const_op_iterator op_begin() const { return const_op_iterator(this, 0); }
const_op_iterator op_end() const { return const_op_iterator(this, getNumOperands()); }