diff options
-rw-r--r-- | include/clang/Basic/SourceManager.h | 3 | ||||
-rw-r--r-- | lib/Basic/SourceManager.cpp | 2 | ||||
-rw-r--r-- | test/Index/annotate-tokens-pp.c | 7 | ||||
-rw-r--r-- | unittests/Basic/Makefile | 2 | ||||
-rw-r--r-- | unittests/Basic/SourceManagerTest.cpp | 108 | ||||
-rw-r--r-- | unittests/CMakeLists.txt | 3 |
6 files changed, 117 insertions, 8 deletions
diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 4193aeee43..4aed17ac13 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -438,8 +438,7 @@ public: // to determine which came first. This will also take care the case where // one of the locations points at the inclusion/expansion point of the other // in which case its FileID will come before the other. - if (LOffset == ROffset && - (LQueryFID != CommonFID || RQueryFID != CommonFID)) + if (LOffset == ROffset) return IsLQFIDBeforeRQFID; return LOffset < ROffset; diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 310b68eaeb..b278f3d963 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -1665,7 +1665,7 @@ static bool MoveUpIncludeHierarchy(std::pair<FileID, unsigned> &Loc, SourceLocation UpperLoc; const SrcMgr::SLocEntry &Entry = SM.getSLocEntry(Loc.first); if (Entry.isExpansion()) - UpperLoc = Entry.getExpansion().getExpansionLocEnd(); + UpperLoc = Entry.getExpansion().getExpansionLocStart(); else UpperLoc = Entry.getFile().getIncludeLoc(); diff --git a/test/Index/annotate-tokens-pp.c b/test/Index/annotate-tokens-pp.c index 45988270f0..b37ab39eea 100644 --- a/test/Index/annotate-tokens-pp.c +++ b/test/Index/annotate-tokens-pp.c @@ -124,7 +124,7 @@ const char *fname = __FILE__; // CHECK: Punctuation: "," [16:26 - 16:27] // CHECK: Identifier: "z" [16:27 - 16:28] DeclRefExpr=z:14:7 // FIXME: The token below should really be annotated as "macro expansion=REVERSE_MACRO:10:9" -// CHECK: Punctuation: ")" [16:28 - 16:29] VarDecl=k:16:7 (Definition) +// CHECK: Punctuation: ")" [16:28 - 16:29] DeclStmt= // CHECK: Punctuation: ";" [16:29 - 16:30] DeclStmt= // CHECK: Keyword: "int" [17:3 - 17:6] VarDecl=j:17:7 (Definition) // CHECK: Identifier: "j" [17:7 - 17:8] VarDecl=j:17:7 (Definition) @@ -135,7 +135,7 @@ const char *fname = __FILE__; // CHECK: Punctuation: "+" [17:25 - 17:26] BinaryOperator= // CHECK: Identifier: "k" [17:27 - 17:28] DeclRefExpr=k:16:7 // FIXME: The token below should really be annotated as "macro expansion=TWICE_MACRO:11:9" -// CHECK: Punctuation: ")" [17:28 - 17:29] VarDecl=j:17:7 (Definition) +// CHECK: Punctuation: ")" [17:28 - 17:29] DeclStmt= // CHECK: Punctuation: ";" [17:29 - 17:30] DeclStmt= // CHECK: Keyword: "int" [18:3 - 18:6] VarDecl=w:18:7 (Definition) // CHECK: Identifier: "w" [18:7 - 18:8] VarDecl=w:18:7 (Definition) @@ -189,7 +189,8 @@ const char *fname = __FILE__; // CHECK: Identifier: "z" [25:43 - 25:44] DeclRefExpr=z:25:3 // CHECK: Punctuation: ";" [25:44 - 25:45] CompoundStmt= // CHECK: Punctuation: "}" [25:46 - 25:47] CompoundStmt= -// CHECK: Punctuation: ")" [25:47 - 25:48] DoStmt= +// FIXME: The token below should really be annotated as "macro expansion=fun_with_macro_bodies:21:9" +// CHECK: Punctuation: ")" [25:47 - 25:48] CompoundStmt= // CHECK: Punctuation: ";" [25:48 - 25:49] CompoundStmt= // CHECK: Punctuation: "}" [26:1 - 26:2] CompoundStmt= // CHECK: {{28:1.*inclusion directive=pragma-once.h.*multi-include guarded}} diff --git a/unittests/Basic/Makefile b/unittests/Basic/Makefile index 4bac50c12a..82de790598 100644 --- a/unittests/Basic/Makefile +++ b/unittests/Basic/Makefile @@ -10,6 +10,6 @@ CLANG_LEVEL = ../.. TESTNAME = Basic LINK_COMPONENTS := support mc -USEDLIBS = clangBasic.a +USEDLIBS = clangLex.a clangBasic.a include $(CLANG_LEVEL)/unittests/Makefile diff --git a/unittests/Basic/SourceManagerTest.cpp b/unittests/Basic/SourceManagerTest.cpp new file mode 100644 index 0000000000..caab4414e7 --- /dev/null +++ b/unittests/Basic/SourceManagerTest.cpp @@ -0,0 +1,108 @@ +//===- unittests/Basic/SourceManagerTest.cpp ------ SourceManager tests ---===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "clang/Basic/SourceManager.h" +#include "clang/Basic/FileManager.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/LangOptions.h" +#include "clang/Basic/TargetOptions.h" +#include "clang/Basic/TargetInfo.h" +#include "clang/Lex/ModuleLoader.h" +#include "clang/Lex/HeaderSearch.h" +#include "clang/Lex/Preprocessor.h" + +#include "gtest/gtest.h" + +using namespace llvm; +using namespace clang; + +namespace { + +// The test fixture. +class SourceManagerTest : public ::testing::Test { +protected: + SourceManagerTest() + : FileMgr(FileMgrOpts), + DiagID(new DiagnosticIDs()), + Diags(DiagID, new IgnoringDiagConsumer()), + SourceMgr(Diags, FileMgr) { + TargetOpts.Triple = "x86_64-apple-darwin11.1.0"; + Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts); + } + + FileSystemOptions FileMgrOpts; + FileManager FileMgr; + llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID; + DiagnosticsEngine Diags; + SourceManager SourceMgr; + LangOptions LangOpts; + TargetOptions TargetOpts; + llvm::IntrusiveRefCntPtr<TargetInfo> Target; +}; + +class VoidModuleLoader : public ModuleLoader { + virtual Module *loadModule(SourceLocation ImportLoc, ModuleIdPath Path, + Module::NameVisibilityKind Visibility, + bool IsInclusionDirective) { + return 0; + } +}; + +TEST_F(SourceManagerTest, isBeforeInTranslationUnit) { + const char *source = + "#define M(x) [x]\n" + "M(foo)"; + MemoryBuffer *buf = MemoryBuffer::getMemBuffer(source); + FileID mainFileID = SourceMgr.createMainFileIDForMemBuffer(buf); + + VoidModuleLoader ModLoader; + HeaderSearch HeaderInfo(FileMgr, Diags); + Preprocessor PP(Diags, LangOpts, + Target.getPtr(), + SourceMgr, HeaderInfo, ModLoader, + /*IILookup =*/ 0, + /*OwnsHeaderSearch =*/false, + /*DelayInitialization =*/ false); + PP.EnterMainSourceFile(); + + std::vector<Token> toks; + while (1) { + Token tok; + PP.Lex(tok); + if (tok.is(tok::eof)) + break; + toks.push_back(tok); + } + + // Make sure we got the tokens that we expected. + ASSERT_EQ(3U, toks.size()); + ASSERT_EQ(tok::l_square, toks[0].getKind()); + ASSERT_EQ(tok::identifier, toks[1].getKind()); + ASSERT_EQ(tok::r_square, toks[2].getKind()); + + SourceLocation lsqrLoc = toks[0].getLocation(); + SourceLocation idLoc = toks[1].getLocation(); + SourceLocation rsqrLoc = toks[2].getLocation(); + + SourceLocation macroExpStartLoc = SourceMgr.translateLineCol(mainFileID, 2, 1); + SourceLocation macroExpEndLoc = SourceMgr.translateLineCol(mainFileID, 2, 6); + ASSERT_TRUE(macroExpStartLoc.isFileID()); + ASSERT_TRUE(macroExpEndLoc.isFileID()); + + llvm::SmallString<32> str; + ASSERT_EQ("M", PP.getSpelling(macroExpStartLoc, str)); + ASSERT_EQ(")", PP.getSpelling(macroExpEndLoc, str)); + + EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(lsqrLoc, idLoc)); + EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(idLoc, rsqrLoc)); + EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(macroExpStartLoc, idLoc)); + EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(idLoc, macroExpEndLoc)); +} + +} // anonymous namespace diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index cb44dc59dc..4b662e46f4 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -52,7 +52,8 @@ endif() add_clang_unittest(Basic Basic/FileManagerTest.cpp - USED_LIBS gtest gtest_main clangBasic + Basic/SourceManagerTest.cpp + USED_LIBS gtest gtest_main clangLex ) add_clang_unittest(Frontend |