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