diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -2583,6 +2583,22 @@ InserterTy &getInserter() { return Inserter; } }; +template +IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, + ArrayRef) -> IRBuilder; +IRBuilder(LLVMContext &, MDNode *, ArrayRef) -> IRBuilder<>; +template +IRBuilder(BasicBlock *, FolderTy, MDNode *, ArrayRef) + -> IRBuilder; +IRBuilder(BasicBlock *, MDNode *, ArrayRef) -> IRBuilder<>; +IRBuilder(Instruction *, MDNode *, ArrayRef) -> IRBuilder<>; +template +IRBuilder(BasicBlock *, BasicBlock::iterator, FolderTy, MDNode *, + ArrayRef) -> IRBuilder; +IRBuilder(BasicBlock *, BasicBlock::iterator, MDNode *, + ArrayRef) -> IRBuilder<>; + + // Create wrappers for C Binding types (see CBindingWrapping.h). DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef) diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -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 + using namespace llvm; using ::testing::UnorderedElementsAre; @@ -1156,4 +1159,30 @@ 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>); + IRBuilder Builder2(Ctx); + static_assert(std::is_same_v>); + IRBuilder Builder3(BB, Folder); + static_assert( + std::is_same_v>); + IRBuilder Builder4(BB); + static_assert(std::is_same_v>); + // The block BB is empty, so don't test this one. + // IRBuilder Builder5(BB->getTerminator()); + // static_assert(std::is_same_v>); + IRBuilder Builder6(BB, BB->end(), Folder); + static_assert( + std::is_same_v>); + IRBuilder Builder7(BB, BB->end()); + static_assert(std::is_same_v>); +} }