aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/libclang/LibclangTest.cpp
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2014-06-30 20:04:14 +0000
committerBen Langmuir <blangmuir@apple.com>2014-06-30 20:04:14 +0000
commit33c8090a2f7f2e6d554f84a15a573a7ff7d3f59d (patch)
treeb113aa17c51cca823bd7f4199507d87b48e80264 /clang/unittests/libclang/LibclangTest.cpp
parent557c54d6ca95d0bf6569364b40e6ba6e0defa47f (diff)
downloadllvm-33c8090a2f7f2e6d554f84a15a573a7ff7d3f59d.zip
llvm-33c8090a2f7f2e6d554f84a15a573a7ff7d3f59d.tar.gz
llvm-33c8090a2f7f2e6d554f84a15a573a7ff7d3f59d.tar.bz2
Consider module depedencies when checking a preamble in libclang
Add module dependencies (header files, module map files) to the list of files to check when deciding whether to rebuild a preamble. That fixes using preambles with module imports so long as they are in non-overridden files. My intent is to use to unify the existing dependency collectors to the new “DependencyCollectory” interface from this commit, starting with the DependencyFileGenerator. llvm-svn: 212060
Diffstat (limited to 'clang/unittests/libclang/LibclangTest.cpp')
-rw-r--r--clang/unittests/libclang/LibclangTest.cpp35
1 files changed, 34 insertions, 1 deletions
diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp
index f0bfb27..8f2694f 100644
--- a/clang/unittests/libclang/LibclangTest.cpp
+++ b/clang/unittests/libclang/LibclangTest.cpp
@@ -340,9 +340,9 @@ TEST(libclang, ModuleMapDescriptor) {
}
class LibclangReparseTest : public ::testing::Test {
- std::string TestDir;
std::set<std::string> Files;
public:
+ std::string TestDir;
CXIndex Index;
CXTranslationUnit ClangTU;
unsigned TUFlags;
@@ -420,3 +420,36 @@ TEST_F(LibclangReparseTest, Reparse) {
ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */));
EXPECT_EQ(0U, clang_getNumDiagnostics(ClangTU));
}
+
+TEST_F(LibclangReparseTest, ReparseWithModule) {
+ const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;";
+ const char *HeaderBottom = "\n};\n#endif\n";
+ const char *MFile = "#include \"HeaderFile.h\"\nint main() {"
+ " struct Foo foo; foo.bar = 7; foo.baz = 8; }\n";
+ const char *ModFile = "module A { header \"HeaderFile.h\" }\n";
+ std::string HeaderName = "HeaderFile.h";
+ std::string MName = "MFile.m";
+ std::string ModName = "module.modulemap";
+ WriteFile(MName, MFile);
+ WriteFile(HeaderName, std::string(HeaderTop) + HeaderBottom);
+ WriteFile(ModName, ModFile);
+
+ const char *Args[] = { "-fmodules", "-I", TestDir.c_str() };
+ int NumArgs = sizeof(Args) / sizeof(Args[0]);
+ ClangTU = clang_parseTranslationUnit(Index, MName.c_str(), Args, NumArgs,
+ nullptr, 0, TUFlags);
+ EXPECT_EQ(1U, clang_getNumDiagnostics(ClangTU));
+ DisplayDiagnostics();
+
+ // Immedaitely reparse.
+ ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */));
+ EXPECT_EQ(1U, clang_getNumDiagnostics(ClangTU));
+
+ std::string NewHeaderContents =
+ std::string(HeaderTop) + "int baz;" + HeaderBottom;
+ WriteFile(HeaderName, NewHeaderContents);
+
+ // Reparse after fix.
+ ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */));
+ EXPECT_EQ(0U, clang_getNumDiagnostics(ClangTU));
+}