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 llvm;
2619d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisusing namespace clang;
2719d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
2819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisnamespace {
2919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
30c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidisclass VoidModuleLoader : public ModuleLoader {
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ModuleLoadResult loadModule(SourceLocation ImportLoc,
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              ModuleIdPath Path,
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              Module::NameVisibilityKind Visibility,
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              bool IsInclusionDirective) override {
35c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    return ModuleLoadResult();
36c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  }
37c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void makeModuleVisible(Module *Mod,
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         Module::NameVisibilityKind Visibility,
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         SourceLocation ImportLoc,
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         bool Complain) override { }
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  GlobalModuleIndex *loadGlobalModuleIndex(SourceLocation TriggerLoc) override
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    { return nullptr; }
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool lookupMissingImports(StringRef Name, SourceLocation TriggerLoc) override
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    { return 0; };
47c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis};
48c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
4919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis// The test fixture.
5019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisclass LexerTest : public ::testing::Test {
5119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidisprotected:
5219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  LexerTest()
5319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis    : FileMgr(FileMgrOpts),
5419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis      DiagID(new DiagnosticIDs()),
558e023611637905629b928915cbda22a90b2432c3Douglas Gregor      Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
5607f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor      SourceMgr(Diags, FileMgr),
5707f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor      TargetOpts(new TargetOptions)
5807f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor  {
5907f8cf4ec3ffb6668b35e7b864354faa76167209Douglas Gregor    TargetOpts->Triple = "x86_64-apple-darwin11.1.0";
60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
6119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  }
6219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
63c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> CheckLex(StringRef Source,
64c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                              ArrayRef<tok::TokenKind> ExpectedTokens) {
65c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    MemoryBuffer *buf = MemoryBuffer::getMemBuffer(Source);
666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    SourceMgr.setMainFileID(SourceMgr.createFileID(buf));
67c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
68c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    VoidModuleLoader ModLoader;
69ee0cd37fe4a9f4e2ee73ae34cf93c410cb299a82Manuel Klimek    HeaderSearch HeaderInfo(new HeaderSearchOptions, SourceMgr, Diags, LangOpts,
70ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                            Target.get());
716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Preprocessor PP(new PreprocessorOptions(), Diags, LangOpts, SourceMgr,
72ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                    HeaderInfo, ModLoader, /*IILookup =*/nullptr,
736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                    /*OwnsHeaderSearch =*/false);
746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    PP.Initialize(*Target);
75c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    PP.EnterMainSourceFile();
76c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
77c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    std::vector<Token> toks;
78c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    while (1) {
79c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      Token tok;
80c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      PP.Lex(tok);
81c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      if (tok.is(tok::eof))
82c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis        break;
83c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      toks.push_back(tok);
84c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    }
85c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
86c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    EXPECT_EQ(ExpectedTokens.size(), toks.size());
87c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    for (unsigned i = 0, e = ExpectedTokens.size(); i != e; ++i) {
88c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      EXPECT_EQ(ExpectedTokens[i], toks[i].getKind());
89c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    }
90c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
91c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    return toks;
92c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  }
93c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
94c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::string getSourceText(Token Begin, Token End) {
95c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    bool Invalid;
96c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    StringRef Str =
97c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis        Lexer::getSourceText(CharSourceRange::getTokenRange(SourceRange(
98c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                    Begin.getLocation(), End.getLocation())),
99c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                             SourceMgr, LangOpts, &Invalid);
100c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    if (Invalid)
101c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis      return "<INVALID>";
102c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis    return Str;
103c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  }
104c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
10519d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  FileSystemOptions FileMgrOpts;
10619d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  FileManager FileMgr;
107c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
10819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  DiagnosticsEngine Diags;
10919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceManager SourceMgr;
11019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  LangOptions LangOpts;
111ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  std::shared_ptr<TargetOptions> TargetOpts;
112c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<TargetInfo> Target;
11319d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis};
11419d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
115c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsToMaximumInMacroArgument) {
116c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
117c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
118c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
119c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
120c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
1211a4191d0697098c424646654784399b839f87bc4NAKAMURA Takumi
122c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
123c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(f(M(i)))",
124c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
125c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
126c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[2], toks[2]));
127c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
128c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
129c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsToMaximumInMacroArgumentForEndOfMacro) {
130c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
131c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
132c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
133c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
134c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
135c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(M(i) c)",
136c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
137c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
138c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[0], toks[0]));
139c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
140c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
141c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsInMacroArgumentForBeginOfMacro) {
142c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
143c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
144c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
145c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
146c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
147c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
148c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(c c M(i))",
149c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
150c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
151c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("c M(i)", getSourceText(toks[1], toks[2]));
152c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
153c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
154c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsInMacroArgumentForEndOfMacro) {
155c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
156c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
157c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
158c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
159c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
160c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
161c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(M(i) c c)",
162c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
163c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
164c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i) c", getSourceText(toks[0], toks[1]));
165c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
166c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
167c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextInSeparateFnMacros) {
168c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
169c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
170c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
171c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
172c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
173c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
174c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
175c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(c M(i)) M(M(i) c)",
176c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
177c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
178c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("<INVALID>", getSourceText(toks[1], toks[2]));
179c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
180c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
181c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextWorksAcrossTokenPastes) {
182c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
183c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
184c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
185c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
186c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
187c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
188c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
189c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) M(x##c)\n"
190c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(f(C(i)))",
191c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
192c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
193c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("C(i)", getSourceText(toks[2], toks[2]));
194c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
195c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
196c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsAcrossMultipleMacroCalls) {
197c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
198c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
199c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
200c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
201c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
202c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
203c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
204c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "f(M(M(i)))",
205c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
206c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(M(i))", getSourceText(toks[2], toks[2]));
207c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
208c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
209c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextInMiddleOfMacroArgument) {
210c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
211c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
212c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
213c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
214c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
215c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
216c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
217c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(f(i))",
218c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
219c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("i", getSourceText(toks[2], toks[2]));
220c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
221c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
222c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsAroundDifferentMacroCalls) {
223c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
224c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
225c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
226c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
227c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
228c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
229c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
230c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) x\n"
231c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "f(C(M(i)))",
232c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
233c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("C(M(i))", getSourceText(toks[2], toks[2]));
234c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
235c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
236c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextOnlyExpandsIfFirstTokenInMacro) {
237c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
238c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
239c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
240c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
241c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
242c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
243c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
244c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
245c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) c x\n"
246c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "f(C(M(i)))",
247c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
248c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[3], toks[3]));
249c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
250c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
251c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios KyrtzidisTEST_F(LexerTest, GetSourceTextExpandsRecursively) {
252c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
253c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
254c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
255c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_paren);
256c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
257c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_paren);
258c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
259c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) x\n"
260c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define C(x) c M(x)\n"
261c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "C(f(M(i)))",
262c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
263c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  EXPECT_EQ("M(i)", getSourceText(toks[3], toks[3]));
264c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis}
26519d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
26619d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios KyrtzidisTEST_F(LexerTest, LexAPI) {
267c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<tok::TokenKind> ExpectedTokens;
268c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_square);
269c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
270c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_square);
271c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::l_square);
272c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
273c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::r_square);
274c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
275c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
276c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
277c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  ExpectedTokens.push_back(tok::identifier);
278c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis
279c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis  std::vector<Token> toks = CheckLex("#define M(x) [x]\n"
280c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define N(x) x\n"
281c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define INN(x) x\n"
282c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define NOF1 INN(val)\n"
283c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "#define NOF2 val\n"
284c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "M(foo) N([bar])\n"
285c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     "N(INN(val)) N(NOF1) N(NOF2) N(val)",
286c50c6ff49aa3648ae031349de6f09439f52425f0Argyrios Kyrtzidis                                     ExpectedTokens);
28719d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
28819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceLocation lsqrLoc = toks[0].getLocation();
28919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceLocation idLoc = toks[1].getLocation();
29019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  SourceLocation rsqrLoc = toks[2].getLocation();
29111b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  std::pair<SourceLocation,SourceLocation>
29211b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis    macroPair = SourceMgr.getExpansionRange(lsqrLoc);
29311b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  SourceRange macroRange = SourceRange(macroPair.first, macroPair.second);
29411b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis
29569bda4c027671df7163619f215209529eb236620Argyrios Kyrtzidis  SourceLocation Loc;
29669bda4c027671df7163619f215209529eb236620Argyrios Kyrtzidis  EXPECT_TRUE(Lexer::isAtStartOfMacroExpansion(lsqrLoc, SourceMgr, LangOpts, &Loc));
29711b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_EQ(Loc, macroRange.getBegin());
29819d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  EXPECT_FALSE(Lexer::isAtStartOfMacroExpansion(idLoc, SourceMgr, LangOpts));
29919d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis  EXPECT_FALSE(Lexer::isAtEndOfMacroExpansion(idLoc, SourceMgr, LangOpts));
30069bda4c027671df7163619f215209529eb236620Argyrios Kyrtzidis  EXPECT_TRUE(Lexer::isAtEndOfMacroExpansion(rsqrLoc, SourceMgr, LangOpts, &Loc));
30111b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_EQ(Loc, macroRange.getEnd());
30211b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis
303a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  CharSourceRange range = Lexer::makeFileCharRange(
304a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis           CharSourceRange::getTokenRange(lsqrLoc, idLoc), SourceMgr, LangOpts);
30511b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_TRUE(range.isInvalid());
306a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(idLoc, rsqrLoc),
30711b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis                                   SourceMgr, LangOpts);
30811b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_TRUE(range.isInvalid());
309a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(lsqrLoc, rsqrLoc),
31011b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis                                   SourceMgr, LangOpts);
31111b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_TRUE(!range.isTokenRange());
31211b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis  EXPECT_EQ(range.getAsRange(),
31311b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis            SourceRange(macroRange.getBegin(),
31411b652d41d0d97380ab321a1dba48ecb044f9de8Argyrios Kyrtzidis                        macroRange.getEnd().getLocWithOffset(1)));
315e64d9037658a1b95c79ea275af6167a110b3c563Argyrios Kyrtzidis
316e64d9037658a1b95c79ea275af6167a110b3c563Argyrios Kyrtzidis  StringRef text = Lexer::getSourceText(
317a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                               CharSourceRange::getTokenRange(lsqrLoc, rsqrLoc),
318a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                               SourceMgr, LangOpts);
319e64d9037658a1b95c79ea275af6167a110b3c563Argyrios Kyrtzidis  EXPECT_EQ(text, "M(foo)");
320d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
321d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation macroLsqrLoc = toks[3].getLocation();
322d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation macroIdLoc = toks[4].getLocation();
323d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation macroRsqrLoc = toks[5].getLocation();
324d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation fileLsqrLoc = SourceMgr.getSpellingLoc(macroLsqrLoc);
325d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation fileIdLoc = SourceMgr.getSpellingLoc(macroIdLoc);
326d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  SourceLocation fileRsqrLoc = SourceMgr.getSpellingLoc(macroRsqrLoc);
327d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
328a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(
329a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis      CharSourceRange::getTokenRange(macroLsqrLoc, macroIdLoc),
330a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis      SourceMgr, LangOpts);
331d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(SourceRange(fileLsqrLoc, fileIdLoc.getLocWithOffset(3)),
332d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis            range.getAsRange());
333d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
334a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(CharSourceRange::getTokenRange(macroIdLoc, macroRsqrLoc),
335d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis                                   SourceMgr, LangOpts);
336d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(SourceRange(fileIdLoc, fileRsqrLoc.getLocWithOffset(1)),
337d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis            range.getAsRange());
338d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
339d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  macroPair = SourceMgr.getExpansionRange(macroLsqrLoc);
340a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis  range = Lexer::makeFileCharRange(
341a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                     CharSourceRange::getTokenRange(macroLsqrLoc, macroRsqrLoc),
342a83f4d2315dbeb3914868f1ccb8e74fb2ccdbb0cArgyrios Kyrtzidis                     SourceMgr, LangOpts);
343d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(SourceRange(macroPair.first, macroPair.second.getLocWithOffset(1)),
344d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis            range.getAsRange());
345d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis
346d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  text = Lexer::getSourceText(
347d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis          CharSourceRange::getTokenRange(SourceRange(macroLsqrLoc, macroIdLoc)),
348d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis          SourceMgr, LangOpts);
349d9806c912ae3e870a733acfd83c26e8a1f6a5ffcArgyrios Kyrtzidis  EXPECT_EQ(text, "[bar");
3507f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis
3517f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis
3527f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc1 = toks[6].getLocation();
3537f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc2 = toks[7].getLocation();
3547f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc3 = toks[8].getLocation();
3557f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  SourceLocation idLoc4 = toks[9].getLocation();
3567f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("INN", Lexer::getImmediateMacroName(idLoc1, SourceMgr, LangOpts));
3577f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("INN", Lexer::getImmediateMacroName(idLoc2, SourceMgr, LangOpts));
3587f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("NOF2", Lexer::getImmediateMacroName(idLoc3, SourceMgr, LangOpts));
3597f6cf9764b33381e03fcf7c44f7985a333212b06Argyrios Kyrtzidis  EXPECT_EQ("N", Lexer::getImmediateMacroName(idLoc4, SourceMgr, LangOpts));
36019d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis}
36119d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis
36219d5aea478b4f542e1ef7c36741e719c660bcc20Argyrios Kyrtzidis} // anonymous namespace
363