Add deduction guides for IRBuilder
Differential Revision: https://reviews.llvm.org/D137173
This commit is contained in:
parent
9fe5ca9b30
commit
6a88bceb3c
|
@ -2583,6 +2583,22 @@ public:
|
|||
InserterTy &getInserter() { return Inserter; }
|
||||
};
|
||||
|
||||
template <typename FolderTy, typename InserterTy>
|
||||
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *,
|
||||
ArrayRef<OperandBundleDef>) -> IRBuilder<FolderTy, InserterTy>;
|
||||
IRBuilder(LLVMContext &, MDNode *, ArrayRef<OperandBundleDef>) -> IRBuilder<>;
|
||||
template <typename FolderTy>
|
||||
IRBuilder(BasicBlock *, FolderTy, MDNode *, ArrayRef<OperandBundleDef>)
|
||||
-> IRBuilder<FolderTy>;
|
||||
IRBuilder(BasicBlock *, MDNode *, ArrayRef<OperandBundleDef>) -> IRBuilder<>;
|
||||
IRBuilder(Instruction *, MDNode *, ArrayRef<OperandBundleDef>) -> IRBuilder<>;
|
||||
template <typename FolderTy>
|
||||
IRBuilder(BasicBlock *, BasicBlock::iterator, FolderTy, MDNode *,
|
||||
ArrayRef<OperandBundleDef>) -> IRBuilder<FolderTy>;
|
||||
IRBuilder(BasicBlock *, BasicBlock::iterator, MDNode *,
|
||||
ArrayRef<OperandBundleDef>) -> IRBuilder<>;
|
||||
|
||||
|
||||
// Create wrappers for C Binding types (see CBindingWrapping.h).
|
||||
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef)
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Analysis/InstSimplifyFolder.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/DIBuilder.h"
|
||||
|
@ -21,6 +22,8 @@
|
|||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
using namespace llvm;
|
||||
using ::testing::UnorderedElementsAre;
|
||||
|
||||
|
@ -1156,4 +1159,30 @@ TEST_F(IRBuilderTest, NoFolderNames) {
|
|||
Builder.CreateAdd(Builder.getInt32(1), Builder.getInt32(2), "add");
|
||||
EXPECT_EQ(Add->getName(), "add");
|
||||
}
|
||||
|
||||
TEST_F(IRBuilderTest, CTAD) {
|
||||
struct TestInserter : public IRBuilderDefaultInserter {
|
||||
TestInserter() = default;
|
||||
};
|
||||
InstSimplifyFolder Folder(M->getDataLayout());
|
||||
|
||||
IRBuilder Builder1(Ctx, Folder, TestInserter());
|
||||
static_assert(std::is_same_v<decltype(Builder1),
|
||||
IRBuilder<InstSimplifyFolder, TestInserter>>);
|
||||
IRBuilder Builder2(Ctx);
|
||||
static_assert(std::is_same_v<decltype(Builder2), IRBuilder<>>);
|
||||
IRBuilder Builder3(BB, Folder);
|
||||
static_assert(
|
||||
std::is_same_v<decltype(Builder3), IRBuilder<InstSimplifyFolder>>);
|
||||
IRBuilder Builder4(BB);
|
||||
static_assert(std::is_same_v<decltype(Builder4), IRBuilder<>>);
|
||||
// The block BB is empty, so don't test this one.
|
||||
// IRBuilder Builder5(BB->getTerminator());
|
||||
// static_assert(std::is_same_v<decltype(Builder5), IRBuilder<>>);
|
||||
IRBuilder Builder6(BB, BB->end(), Folder);
|
||||
static_assert(
|
||||
std::is_same_v<decltype(Builder6), IRBuilder<InstSimplifyFolder>>);
|
||||
IRBuilder Builder7(BB, BB->end());
|
||||
static_assert(std::is_same_v<decltype(Builder7), IRBuilder<>>);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue