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