diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-01-13 00:10:38 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-01-13 00:10:38 +0000 |
commit | 4fef722974dd847a26cb2bdad6fd4a298e1edd1f (patch) | |
tree | 6a8bcdb2d9a77ad0ba8fb0401a055744c4ea8e8c /unittests | |
parent | 7472c760521ad240b5a389d71a7b30037bd84b56 (diff) | |
download | llvm-4fef722974dd847a26cb2bdad6fd4a298e1edd1f.tar.gz |
IR: Fix an inverted assertion when replacing resolved operands
Add a unit test, since this bug was only exposed by clang tests. Thanks
to Rafael for tracking this down!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225738 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r-- | unittests/IR/MetadataTest.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/unittests/IR/MetadataTest.cpp b/unittests/IR/MetadataTest.cpp index af110742dd7..c364aeacba1 100644 --- a/unittests/IR/MetadataTest.cpp +++ b/unittests/IR/MetadataTest.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/STLExtras.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" @@ -361,6 +362,28 @@ TEST_F(MDNodeTest, handleChangedOperandRecursion) { EXPECT_EQ(N4, N6->getOperand(0)); } +TEST_F(MDNodeTest, replaceResolvedOperand) { + // Check code for replacing one resolved operand with another. If doing this + // directly (via replaceOperandWith()) becomes illegal, change the operand to + // a global value that gets RAUW'ed. + // + // Use a temporary node to keep N from being resolved. + std::unique_ptr<MDNodeFwdDecl> Temp(MDNodeFwdDecl::get(Context, None)); + Metadata *Ops[] = {nullptr, Temp.get()}; + + MDNode *Empty = MDTuple::get(Context, {}); + MDNode *N = MDTuple::get(Context, Ops); + EXPECT_EQ(nullptr, N->getOperand(0)); + ASSERT_FALSE(N->isResolved()); + + // Check code for replacing resolved nodes. + N->replaceOperandWith(0, Empty); + EXPECT_EQ(Empty, N->getOperand(0)); + + // Remove the reference to Temp; required for teardown. + N->replaceOperandWith(1, nullptr); +} + typedef MetadataTest MetadataAsValueTest; TEST_F(MetadataAsValueTest, MDNode) { |