IR: Specialize MDScope::getFile() for MDFile

Fix `MDScope::getFile()` so that it correctly returns a valid `MDFile`
even when it's an instance of `MDFile`.  This logic is necessary because
of r230057.  I'm working on moving the new hierarchy into place
out-of-tree (on track to commit Monday morning, BTW), and this was
exposed by a few failing tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230871 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2015-02-28 21:47:02 +00:00
parent 80f65ca7ee
commit 5bcf130056
2 changed files with 15 additions and 1 deletions

View File

@ -330,7 +330,15 @@ protected:
~MDScope() {}
public:
Metadata *getFile() const { return getOperand(0); }
/// \brief Return the underlying file.
///
/// An \a MDFile is an \a MDScope, but it doesn't point at a separate file
/// (it\em is the file). If \c this is an \a MDFile, we need to return \c
/// this. Otherwise, return the first operand, which is where all other
/// subclasses store their file pointer.
Metadata *getFile() const {
return isa<MDFile>(this) ? const_cast<MDScope *>(this) : getOperand(0);
}
static bool classof(const Metadata *MD) {
switch (MD->getMetadataID()) {

View File

@ -1041,6 +1041,12 @@ TEST_F(MDFileTest, get) {
EXPECT_EQ(N, MDNode::replaceWithUniqued(std::move(Temp)));
}
TEST_F(MDFileTest, ScopeGetFile) {
// Ensure that MDScope::getFile() returns itself.
MDScope *N = MDFile::get(Context, "file", "dir");
EXPECT_EQ(N, N->getFile());
}
typedef MetadataTest MDCompileUnitTest;
TEST_F(MDCompileUnitTest, get) {