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

@@ -14,11 +14,14 @@
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Operator.h"
#include "gtest/gtest.h"
#include <memory>
namespace llvm {
namespace {
@@ -47,6 +50,29 @@ TEST(InstructionsTest, ReturnInst) {
delete r1;
}
TEST(InstructionsTest, CallInst) {
LLVMContext &C(getGlobalContext());
std::unique_ptr<Module> M(new Module("MyModule", C));
Type *ArgTypes[] = {Type::getInt8Ty(C), Type::getInt32Ty(C),
Type::getInt64Ty(C)};
FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), ArgTypes, false);
Function *F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
Value *Args[] = {ConstantInt::get(Type::getInt8Ty(C), 20),
ConstantInt::get(Type::getInt32Ty(C), 9999),
ConstantInt::get(Type::getInt64Ty(C), 42)};
CallInst *Call = CallInst::Create(F, Args);
// Make sure iteration over a call's arguments works as expected.
unsigned Idx = 0;
for (Value *Arg : Call->arg_operands()) {
EXPECT_EQ(ArgTypes[Idx], Arg->getType());
EXPECT_EQ(Call->getArgOperand(Idx)->getType(), Arg->getType());
Idx++;
}
}
TEST(InstructionsTest, BranchInst) {
LLVMContext &C(getGlobalContext());