Fix problem with r204836

In CallInst, op_end() points at the callee, which we don't want to iterate over
when just iterating over arguments. Now take this into account when returning
a iterator_range from arg_operands. Similar reasoning for InvokeInst.

Also adds a unit test to verify this actually works as expected.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204851 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Bendersky
2014-03-26 20:41:15 +00:00
parent 6da0178737
commit 1003e8fbfa
2 changed files with 32 additions and 4 deletions

View File

@@ -1297,12 +1297,14 @@ public:
/// arg_operands - iteration adapter for range-for loops.
iterator_range<op_iterator> arg_operands() {
return iterator_range<op_iterator>(op_begin(), op_end());
// The last operand in the op list is the callee - it's not one of the args
// so we don't want to iterate over it.
return iterator_range<op_iterator>(op_begin(), op_end() - 1);
}
/// arg_operands - iteration adapter for range-for loops.
iterator_range<const_op_iterator> arg_operands() const {
return iterator_range<const_op_iterator>(op_begin(), op_end());
return iterator_range<const_op_iterator>(op_begin(), op_end() - 1);
}
/// \brief Wrappers for getting the \c Use of a call argument.
@@ -2954,12 +2956,12 @@ public:
/// arg_operands - iteration adapter for range-for loops.
iterator_range<op_iterator> arg_operands() {
return iterator_range<op_iterator>(op_begin(), op_end());
return iterator_range<op_iterator>(op_begin(), op_end() - 3);
}
/// arg_operands - iteration adapter for range-for loops.
iterator_range<const_op_iterator> arg_operands() const {
return iterator_range<const_op_iterator>(op_begin(), op_end());
return iterator_range<const_op_iterator>(op_begin(), op_end() - 3);
}
/// \brief Wrappers for getting the \c Use of a invoke argument.