aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/Basic/SourceManagerTest.cpp
diff options
context:
space:
mode:
authorTapasweni Pathak <tapaswenipathak@gmail.com>2022-06-26 09:40:43 +0000
committerVassil Vassilev <v.g.vassilev@gmail.com>2022-06-26 13:21:23 +0000
commite881d85371bf9b024e0668f1667fefde4df05711 (patch)
tree3269994c5c4b364e8c4c7a725a7190bc6e200b6f /clang/unittests/Basic/SourceManagerTest.cpp
parent3fa2411dc56f418b629fee23754cada8c57fa9fe (diff)
downloadllvm-e881d85371bf9b024e0668f1667fefde4df05711.zip
llvm-e881d85371bf9b024e0668f1667fefde4df05711.tar.gz
llvm-e881d85371bf9b024e0668f1667fefde4df05711.tar.bz2
Allow interfaces to operate on in-memory buffers with no source location info.
This patch is a part of the upstreaming efforts. Cling has the ability to spawn child interpreters (mainly for auto completions). The child interpreter import Decls using the ASTImporter which casuses the assertion here https://github.com/llvm/llvm-project/blob/65eb74e94b414fcde6bfa810d1c30c7fcb136b77/clang/include/clang/Basic/SourceLocation.h#L322 The patch is co-developed with V. Vassilev. Differential revision: https://reviews.llvm.org/D88780
Diffstat (limited to 'clang/unittests/Basic/SourceManagerTest.cpp')
-rw-r--r--clang/unittests/Basic/SourceManagerTest.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/clang/unittests/Basic/SourceManagerTest.cpp b/clang/unittests/Basic/SourceManagerTest.cpp
index dadfcc9..e98100f 100644
--- a/clang/unittests/Basic/SourceManagerTest.cpp
+++ b/clang/unittests/Basic/SourceManagerTest.cpp
@@ -51,6 +51,73 @@ protected:
IntrusiveRefCntPtr<TargetInfo> Target;
};
+TEST_F(SourceManagerTest, isInMemoryBuffersNoSourceLocationInfo) {
+ // Check for invalid source location for each method
+ SourceLocation LocEmpty;
+ bool isWrittenInBuiltInFileFalse = SourceMgr.isWrittenInBuiltinFile(LocEmpty);
+ bool isWrittenInCommandLineFileFalse =
+ SourceMgr.isWrittenInCommandLineFile(LocEmpty);
+ bool isWrittenInScratchSpaceFalse =
+ SourceMgr.isWrittenInScratchSpace(LocEmpty);
+
+ EXPECT_FALSE(isWrittenInBuiltInFileFalse);
+ EXPECT_FALSE(isWrittenInCommandLineFileFalse);
+ EXPECT_FALSE(isWrittenInScratchSpaceFalse);
+
+ // Check for valid source location per filename for each method
+ const char *Source = "int x";
+
+ std::unique_ptr<llvm::MemoryBuffer> BuiltInBuf =
+ llvm::MemoryBuffer::getMemBuffer(Source);
+ const FileEntry *BuiltInFile =
+ FileMgr.getVirtualFile("<built-in>", BuiltInBuf->getBufferSize(), 0);
+ SourceMgr.overrideFileContents(BuiltInFile, std::move(BuiltInBuf));
+ FileID BuiltInFileID =
+ SourceMgr.getOrCreateFileID(BuiltInFile, SrcMgr::C_User);
+ SourceMgr.setMainFileID(BuiltInFileID);
+ SourceLocation LocBuiltIn =
+ SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
+ bool isWrittenInBuiltInFileTrue =
+ SourceMgr.isWrittenInBuiltinFile(LocBuiltIn);
+
+ std::unique_ptr<llvm::MemoryBuffer> CommandLineBuf =
+ llvm::MemoryBuffer::getMemBuffer(Source);
+ const FileEntry *CommandLineFile = FileMgr.getVirtualFile(
+ "<command line>", CommandLineBuf->getBufferSize(), 0);
+ SourceMgr.overrideFileContents(CommandLineFile, std::move(CommandLineBuf));
+ FileID CommandLineFileID =
+ SourceMgr.getOrCreateFileID(CommandLineFile, SrcMgr::C_User);
+ SourceMgr.setMainFileID(CommandLineFileID);
+ SourceLocation LocCommandLine =
+ SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
+ bool isWrittenInCommandLineFileTrue =
+ SourceMgr.isWrittenInCommandLineFile(LocCommandLine);
+
+ std::unique_ptr<llvm::MemoryBuffer> ScratchSpaceBuf =
+ llvm::MemoryBuffer::getMemBuffer(Source);
+ const FileEntry *ScratchSpaceFile = FileMgr.getVirtualFile(
+ "<scratch space>", ScratchSpaceBuf->getBufferSize(), 0);
+ SourceMgr.overrideFileContents(ScratchSpaceFile, std::move(ScratchSpaceBuf));
+ FileID ScratchSpaceFileID =
+ SourceMgr.getOrCreateFileID(ScratchSpaceFile, SrcMgr::C_User);
+ SourceMgr.setMainFileID(ScratchSpaceFileID);
+ SourceLocation LocScratchSpace =
+ SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
+ bool isWrittenInScratchSpaceTrue =
+ SourceMgr.isWrittenInScratchSpace(LocScratchSpace);
+
+ EXPECT_TRUE(isWrittenInBuiltInFileTrue);
+ EXPECT_TRUE(isWrittenInCommandLineFileTrue);
+ EXPECT_TRUE(isWrittenInScratchSpaceTrue);
+}
+
+TEST_F(SourceManagerTest, isInSystemHeader) {
+ // Check for invalid source location
+ SourceLocation LocEmpty;
+ bool isInSystemHeaderFalse = SourceMgr.isInSystemHeader(LocEmpty);
+ ASSERT_FALSE(isInSystemHeaderFalse);
+}
+
TEST_F(SourceManagerTest, isBeforeInTranslationUnit) {
const char *source =
"#define M(x) [x]\n"