diff options
author | Eli Bendersky <eliben@google.com> | 2014-03-26 20:41:15 +0000 |
---|---|---|
committer | Eli Bendersky <eliben@google.com> | 2014-03-26 20:41:15 +0000 |
commit | 1003e8fbfa2f436e88ef801cf4c3d33fc978e565 (patch) | |
tree | 8a5f80dab085cbee80917d8c9501063f24697e3a /unittests | |
parent | 6da017873777cbe06bf2d5606e408c7cda85062e (diff) |
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
Diffstat (limited to 'unittests')
-rw-r--r-- | unittests/IR/InstructionsTest.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/unittests/IR/InstructionsTest.cpp b/unittests/IR/InstructionsTest.cpp index 962c07eea14..94065289e2e 100644 --- a/unittests/IR/InstructionsTest.cpp +++ b/unittests/IR/InstructionsTest.cpp @@ -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()); |