diff options
author | Cameron Desrochers <cameron@moodycamel.com> | 2018-01-15 19:14:16 +0000 |
---|---|---|
committer | Cameron Desrochers <cameron@moodycamel.com> | 2018-01-15 19:14:16 +0000 |
commit | b60f1b6d3debbbdbcd057d763fbef7e2492718a3 (patch) | |
tree | 33481cdd9f976cbb15d616dee5153473fd7aee87 /clang/unittests/libclang/LibclangTest.cpp | |
parent | bbe81f2d5560cb93b89ae88cf5f4b0864c50c440 (diff) | |
download | llvm-b60f1b6d3debbbdbcd057d763fbef7e2492718a3.zip llvm-b60f1b6d3debbbdbcd057d763fbef7e2492718a3.tar.gz llvm-b60f1b6d3debbbdbcd057d763fbef7e2492718a3.tar.bz2 |
[PCH] Serialize skipped preprocessor ranges
The skipped preprocessor ranges are now serialized in the AST PCH file. This fixes, for example, libclang's clang_getSkippedRanges() returning zero ranges after reparsing a translation unit.
Differential Revision: https://reviews.llvm.org/D20124
llvm-svn: 322503
Diffstat (limited to 'clang/unittests/libclang/LibclangTest.cpp')
-rw-r--r-- | clang/unittests/libclang/LibclangTest.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp index f2a96d6..c0f9eb6 100644 --- a/clang/unittests/libclang/LibclangTest.cpp +++ b/clang/unittests/libclang/LibclangTest.cpp @@ -572,3 +572,81 @@ TEST_F(LibclangReparseTest, clang_parseTranslationUnit2FullArgv) { EXPECT_EQ(0U, clang_getNumDiagnostics(ClangTU)); DisplayDiagnostics(); } + +TEST_F(LibclangReparseTest, PreprocessorSkippedRanges) { + std::string Header = "header.h", Main = "main.cpp"; + WriteFile(Header, + "#ifdef MANGOS\n" + "printf(\"mmm\");\n" + "#endif"); + WriteFile(Main, + "#include \"header.h\"\n" + "#ifdef GUAVA\n" + "#endif\n" + "#ifdef KIWIS\n" + "printf(\"mmm!!\");\n" + "#endif"); + + for (int i = 0; i != 3; ++i) { + unsigned flags = TUFlags | CXTranslationUnit_PrecompiledPreamble; + if (i == 2) + flags |= CXTranslationUnit_CreatePreambleOnFirstParse; + + // parse once + ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, + nullptr, 0, flags); + if (i != 0) { + // reparse + ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */)); + } + + // Check all ranges are there + CXSourceRangeList *Ranges = clang_getAllSkippedRanges(ClangTU); + EXPECT_EQ(3U, Ranges->count); + + CXSourceLocation cxl; + unsigned line; + cxl = clang_getRangeStart(Ranges->ranges[0]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(1U, line); + cxl = clang_getRangeEnd(Ranges->ranges[0]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(3U, line); + + cxl = clang_getRangeStart(Ranges->ranges[1]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(2U, line); + cxl = clang_getRangeEnd(Ranges->ranges[1]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(3U, line); + + cxl = clang_getRangeStart(Ranges->ranges[2]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(4U, line); + cxl = clang_getRangeEnd(Ranges->ranges[2]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(6U, line); + + clang_disposeSourceRangeList(Ranges); + + // Check obtaining ranges by each file works + CXFile cxf = clang_getFile(ClangTU, Header.c_str()); + Ranges = clang_getSkippedRanges(ClangTU, cxf); + EXPECT_EQ(1U, Ranges->count); + cxl = clang_getRangeStart(Ranges->ranges[0]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(1U, line); + clang_disposeSourceRangeList(Ranges); + + cxf = clang_getFile(ClangTU, Main.c_str()); + Ranges = clang_getSkippedRanges(ClangTU, cxf); + EXPECT_EQ(2U, Ranges->count); + cxl = clang_getRangeStart(Ranges->ranges[0]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(2U, line); + cxl = clang_getRangeStart(Ranges->ranges[1]); + clang_getSpellingLocation(cxl, nullptr, &line, nullptr, nullptr); + EXPECT_EQ(4U, line); + clang_disposeSourceRangeList(Ranges); + } +} |