11050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth//===- unittests/Lex/LexerTest.cpp ------ Lexer tests ---------------------===//
219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis//
319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis//
519d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
619d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
719d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis//
819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
101050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Lex/Lexer.h"
1119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis#include "clang/Basic/Diagnostic.h"
123aeb34f5639ca03ba952bef7239028eaaec33281Douglas Gregor#include "clang/Basic/DiagnosticOptions.h"
131050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Basic/FileManager.h"
1419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis#include "clang/Basic/LangOptions.h"
157cc315ccf80382fab7674735fbfda95990d28f8eChandler Carruth#include "clang/Basic/SourceManager.h"
1619d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis#include "clang/Basic/TargetInfo.h"
171050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Basic/TargetOptions.h"
1819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis#include "clang/Lex/HeaderSearch.h"
19b0985c86f7f75e780bfeb366afdbee7676c28948Douglas Gregor#include "clang/Lex/HeaderSearchOptions.h"
201050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Lex/ModuleLoader.h"
2119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis#include "clang/Lex/Preprocessor.h"
2236a16498ff911a218f26c7955376bbe99ddb16dfDouglas Gregor#include "clang/Lex/PreprocessorOptions.h"
2319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis#include "gtest/gtest.h"
2419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
2519d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisusing namespace clang;
2619d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
2719d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisnamespace {
2819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
29c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidisclass VoidModuleLoader : public ModuleLoader {
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ModuleLoadResult loadModule(SourceLocation ImportLoc,
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              ModuleIdPath Path,
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              Module::NameVisibilityKind Visibility,
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              bool IsInclusionDirective) override {
34c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    return ModuleLoadResult();
35c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  }
36c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void makeModuleVisible(Module *Mod,
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         Module::NameVisibilityKind Visibility,
39b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                         SourceLocation ImportLoc) override { }
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) override
42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    { return nullptr; }
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc) override
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    { return 0; }
45c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis};
46c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
4719d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis// The test fixture.
4819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisclass LexerTest : public ::testing::Test {
4919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisprotected:
5019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  LexerTest()
5119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis    : FileMgr(FileMgrOpts),
5219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis      DiagID(new DiagnosticIDs()),
538e023611637905629b928915cbda22a90b2432c3Douglas Gregor      Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
5407f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor      SourceMgr(Diags, FileMgr),
5507f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor      TargetOpts(new TargetOptions)
5607f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor  {
5707f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor    TargetOpts->Triple = "x86_64-apple-darwin11.1.0";
58c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
5919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  }
6019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<Token> Lex(StringRef Source) {
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::unique_ptr<llvm::MemoryBuffer> Buf =
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        llvm::MemoryBuffer::getMemBuffer(Source);
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    SourceMgr.setMainFileID(SourceMgr.createFileID(std::move(Buf)));
65c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
66c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    VoidModuleLoader ModLoader;
67ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags, LangOpts,
68c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                            Target.get());
696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts, SourceMgr,
70c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                    HeaderInfo, ModLoader, /*IILookup =*/nullptr,
716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                    /*OwnsHeaderSearch =*/false);
726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    PP.Initialize(*Target);
73c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    PP.EnterMainSourceFile();
74c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
75c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    std::vector<Token> toks;
76c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    while (1) {
77c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      Token tok;
78c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      PP.Lex(tok);
79c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      if (tok.is(tok::eof))
80c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis        break;
81c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      toks.push_back(tok);
82c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    }
83c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return toks;
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<Token> CheckLex(StringRef Source,
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              ArrayRef<tok::TokenKind> ExpectedTokens) {
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto toks = Lex(Source);
90c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    EXPECT_EQ(ExpectedTokens.size(), toks.size());
91c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    for (unsigned i = 0, e = ExpectedTokens.size(); i != e; ++i) {
92c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      EXPECT_EQ(ExpectedTokens[i], toks[i].getKind());
93c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    }
94c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
95c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    return toks;
96c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  }
97c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
98c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::string getSourceText(Token Begin, Token End) {
99c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    bool Invalid;
100c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    StringRef Str =
101c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis        Lexer::getSourceText(CharSourceRange::getTokenRange(SourceRange(
102c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                    Begin.getLocation(), End.getLocation())),
103c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                             SourceMgr, LangOpts, &Invalid);
104c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    if (Invalid)
105c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      return "<INVALID>";
106c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    return Str;
107c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  }
108c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
10919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  FileSystemOptions FileMgrOpts;
11019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  FileManager FileMgr;
111c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
11219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  DiagnosticsEngine Diags;
11319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceManager SourceMgr;
11419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  LangOptions LangOpts;
115c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  std::shared_ptr<TargetOptions> TargetOpts;
116c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<TargetInfo> Target;
11719d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis};
11819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
119c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsToMaximumInMacroArgument) {
120c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
121c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
122c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
123c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
124c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
1251a4191d0697098c424646654784399b839f87bc4NAKAMURA Takumi
126c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
127c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(f(M(i)))",
128c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
129c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
130c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[2], toks[2]));
131c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
132c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
133c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsToMaximumInMacroArgumentForEndOfMacro) {
134c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
135c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
136c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
137c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
138c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
139c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(M(i) c)",
140c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
141c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
142c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[0], toks[0]));
143c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
144c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
145c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsInMacroArgumentForBeginOfMacro) {
146c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
147c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
148c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
149c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
150c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
151c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
152c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(c c M(i))",
153c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
154c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
155c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("c M(i)", getSourceText(toks[1], toks[2]));
156c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
157c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
158c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsInMacroArgumentForEndOfMacro) {
159c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
160c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
161c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
162c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
163c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
164c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
165c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(M(i) c c)",
166c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
167c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
168c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i) c", getSourceText(toks[0], toks[1]));
169c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
170c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
171c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextInSeparateFnMacros) {
172c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
173c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
174c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
175c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
176c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
177c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
178c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
179c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(c M(i)) M(M(i) c)",
180c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
181c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
182c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("<INVALID>", getSourceText(toks[1], toks[2]));
183c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
184c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
185c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextWorksAcrossTokenPastes) {
186c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
187c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
188c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
189c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
190c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
191c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
192c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
193c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) M(x##c)\n"
194c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(f(C(i)))",
195c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
196c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
197c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("C(i)", getSourceText(toks[2], toks[2]));
198c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
199c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
200c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsAcrossMultipleMacroCalls) {
201c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
202c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
203c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
204c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
205c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
206c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
207c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
208c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "f(M(M(i)))",
209c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
210c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(M(i))", getSourceText(toks[2], toks[2]));
211c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
212c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
213c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextInMiddleOfMacroArgument) {
214c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
215c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
216c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
217c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
218c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
219c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
220c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
221c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(f(i))",
222c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
223c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("i", getSourceText(toks[2], toks[2]));
224c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
225c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
226c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsAroundDifferentMacroCalls) {
227c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
228c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
229c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
230c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
231c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
232c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
233c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
234c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) x\n"
235c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "f(C(M(i)))",
236c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
237c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("C(M(i))", getSourceText(toks[2], toks[2]));
238c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
239c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
240c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextOnlyExpandsIfFirstTokenInMacro) {
241c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
242c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
243c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
244c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
245c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
246c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
247c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
248c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
249c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) c x\n"
250c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "f(C(M(i)))",
251c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
252c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[3], toks[3]));
253c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
254c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
255c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsRecursively) {
256c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
257c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
258c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
259c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
260c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
261c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
262c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
263c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
264c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) c M(x)\n"
265c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "C(f(M(i)))",
266c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
267c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[3], toks[3]));
268c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
26919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
27019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios KyrtzidisTEST_F(LexerTest, LexAPI) {
271c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
272c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_square);
273c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
274c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_square);
275c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_square);
276c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
277c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_square);
278c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
279c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
280c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
281c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
282c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
283c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) [x]\n"
284c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define N(x) x\n"
285c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define INN(x) x\n"
286c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define NOF1 INN(val)\n"
287c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define NOF2 val\n"
288c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(foo) N([bar])\n"
289c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "N(INN(val)) N(NOF1) N(NOF2) N(val)",
290c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
29119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
29219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceLocation lsqrLoc = toks[0].getLocation();
29319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceLocation idLoc = toks[1].getLocation();
29419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceLocation rsqrLoc = toks[2].getLocation();
29511b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  std::pair<SourceLocation,SourceLocation>
29611b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis    macroPair = SourceMgr.getExpansionRange(lsqrLoc);
29711b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  SourceRange macroRange = SourceRange(macroPair.first, macroPair.second);
29811b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis
29969bda4c027671df7163619f215209529eb236620Argyrios Kyrtzidis  SourceLocation Loc;
30069bda4c027671df7163619f215209529eb236620Argyrios Kyrtzidis  EXPECT_TRUE(Lexer::isAtStartOfMacroExpansion(lsqrLoc, SourceMgr, LangOpts, &Loc));
30111b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_EQ(Loc, macroRange.getBegin());
30219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  EXPECT_FALSE(Lexer::isAtStartOfMacroExpansion(idLoc, SourceMgr, LangOpts));
30319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  EXPECT_FALSE(Lexer::isAtEndOfMacroExpansion(idLoc, SourceMgr, LangOpts));
30469bda4c027671df7163619f215209529eb236620Argyrios Kyrtzidis  EXPECT_TRUE(Lexer::isAtEndOfMacroExpansion(rsqrLoc, SourceMgr, LangOpts, &Loc));
30511b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_EQ(Loc, macroRange.getEnd());
30611b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis
307a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  CharSourceRange range = Lexer::makeFileCharRange(
308a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis           CharSourceRange::getTokenRange(lsqrLoc, idLoc), SourceMgr, LangOpts);
30911b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_TRUE(range.isInvalid());
310a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(idLoc, rsqrLoc),
31111b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis                                   SourceMgr, LangOpts);
31211b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_TRUE(range.isInvalid());
313a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(lsqrLoc, rsqrLoc),
31411b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis                                   SourceMgr, LangOpts);
31511b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_TRUE(!range.isTokenRange());
31611b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_EQ(range.getAsRange(),
31711b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis            SourceRange(macroRange.getBegin(),
31811b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis                        macroRange.getEnd().getLocWithOffset(1)));
319e64d9037658a1b95c79ea275af6167a110b3c563Argyrios Kyrtzidis
320e64d9037658a1b95c79ea275af6167a110b3c563Argyrios Kyrtzidis  StringRef text = Lexer::getSourceText(
321a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                               CharSourceRange::getTokenRange(lsqrLoc, rsqrLoc),
322a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                               SourceMgr, LangOpts);
323e64d9037658a1b95c79ea275af6167a110b3c563Argyrios Kyrtzidis  EXPECT_EQ(text, "M(foo)");
324d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
325d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation macroLsqrLoc = toks[3].getLocation();
326d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation macroIdLoc = toks[4].getLocation();
327d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation macroRsqrLoc = toks[5].getLocation();
328d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation fileLsqrLoc = SourceMgr.getSpellingLoc(macroLsqrLoc);
329d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation fileIdLoc = SourceMgr.getSpellingLoc(macroIdLoc);
330d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation fileRsqrLoc = SourceMgr.getSpellingLoc(macroRsqrLoc);
331d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
332a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(
333a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis      CharSourceRange::getTokenRange(macroLsqrLoc, macroIdLoc),
334a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis      SourceMgr, LangOpts);
335d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(SourceRange(fileLsqrLoc, fileIdLoc.getLocWithOffset(3)),
336d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis            range.getAsRange());
337d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
338a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(macroIdLoc, macroRsqrLoc),
339d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis                                   SourceMgr, LangOpts);
340d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(SourceRange(fileIdLoc, fileRsqrLoc.getLocWithOffset(1)),
341d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis            range.getAsRange());
342d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
343d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  macroPair = SourceMgr.getExpansionRange(macroLsqrLoc);
344a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(
345a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                     CharSourceRange::getTokenRange(macroLsqrLoc, macroRsqrLoc),
346a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                     SourceMgr, LangOpts);
347d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(SourceRange(macroPair.first, macroPair.second.getLocWithOffset(1)),
348d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis            range.getAsRange());
349d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
350d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  text = Lexer::getSourceText(
351d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis          CharSourceRange::getTokenRange(SourceRange(macroLsqrLoc, macroIdLoc)),
352d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis          SourceMgr, LangOpts);
353d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(text, "[bar");
3547f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis
3557f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis
3567f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc1 = toks[6].getLocation();
3577f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc2 = toks[7].getLocation();
3587f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc3 = toks[8].getLocation();
3597f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc4 = toks[9].getLocation();
3607f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("INN", Lexer::getImmediateMacroName(idLoc1, SourceMgr, LangOpts));
3617f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("INN", Lexer::getImmediateMacroName(idLoc2, SourceMgr, LangOpts));
3627f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("NOF2", Lexer::getImmediateMacroName(idLoc3, SourceMgr, LangOpts));
3637f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("N", Lexer::getImmediateMacroName(idLoc4, SourceMgr, LangOpts));
36419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis}
36519d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(LexerTest, DontMergeMacroArgsFromDifferentMacroFiles) {
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<Token> toks =
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Lex("#define helper1 0\n"
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          "void helper2(const char *, ...);\n"
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          "#define M1(a, ...) helper2(a, ##__VA_ARGS__)\n"
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          "#define M2(a, ...) M1(a, helper1, ##__VA_ARGS__)\n"
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          "void f1() { M2(\"a\", \"b\"); }");
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Check the file corresponding to the "helper1" macro arg in M2.
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  //
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // The lexer used to report its size as 31, meaning that the end of the
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // expansion would be on the *next line* (just past `M2("a", "b")`). Make
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // sure that we get the correct end location (the comma after "helper1").
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation helper1ArgLoc = toks[20].getLocation();
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(SourceMgr.getFileIDSize(SourceMgr.getFileID(helper1ArgLoc)), 8U);
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
38319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis} // anonymous namespace
384