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.
llvm-svn: 230871
~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()) {
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) {