1128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// 2128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. 3128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// Use of this source code is governed by a BSD-style license that can be 4128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// found in the LICENSE file. 5128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// 6128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 7fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org#include "PreprocessorTest.h" 8128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org#include "Token.h" 9128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 10fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgclass LocationTest : public PreprocessorTest 11128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 12fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgprotected: 13c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org void expectLocation(int count, 14c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org const char* const string[], 15c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org const int length[], 16c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org const pp::SourceLocation& location) 17fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org { 18fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(count, string, length)); 19fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org 20fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org pp::Token token; 21fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org mPreprocessor.lex(&token); 22fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org EXPECT_EQ(pp::Token::IDENTIFIER, token.type); 235b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org EXPECT_EQ("foo", token.text); 24fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org 25fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org EXPECT_EQ(location.file, token.location.file); 26fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org EXPECT_EQ(location.line, token.location.line); 27fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org } 28fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org}; 29fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org 30fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, String0_Line1) 31128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 32128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* str = "foo"; 3346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(0, 1); 34128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 35128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("String0_Line1"); 36c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(1, &str, NULL, loc); 37128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 38128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 39fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, String0_Line2) 40128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 41128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* str = "\nfoo"; 4246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(0, 2); 43128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 44128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("String0_Line2"); 45c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(1, &str, NULL, loc); 46128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 47128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 48fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, String1_Line1) 49128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 50128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* const str[] = {"\n\n", "foo"}; 5146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(1, 1); 52128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 53128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("String1_Line1"); 54c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(2, str, NULL, loc); 55128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 56128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 57fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, String1_Line2) 58128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 59128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* const str[] = {"\n\n", "\nfoo"}; 6046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(1, 2); 61128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 62128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("String1_Line2"); 63c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(2, str, NULL, loc); 64128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 65128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 66fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, NewlineInsideCommentCounted) 67128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 68128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* str = "/*\n\n*/foo"; 6946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(0, 3); 70128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 71128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("NewlineInsideCommentCounted"); 72c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(1, &str, NULL, loc); 73128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 74128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 75fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, ErrorLocationAfterComment) 76a11a6ab8020ee6641ea968806f8983d0e0896cf9alokp@chromium.org{ 77a11a6ab8020ee6641ea968806f8983d0e0896cf9alokp@chromium.org const char* str = "/*\n\n*/@"; 78a11a6ab8020ee6641ea968806f8983d0e0896cf9alokp@chromium.org 7919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); 80fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::INVALID_CHARACTER, 81fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org pp::SourceLocation(0, 3), 82fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org "@")); 832c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org 842c958eefb71f1b939dbda4477df3f0c8fa47a7b8alokp@chromium.org pp::Token token; 85fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.org mPreprocessor.lex(&token); 86a11a6ab8020ee6641ea968806f8983d0e0896cf9alokp@chromium.org} 87a11a6ab8020ee6641ea968806f8983d0e0896cf9alokp@chromium.org 88128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// The location of a token straddling two or more strings is that of the 89128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org// first character of the token. 90128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 91fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, TokenStraddlingTwoStrings) 92128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 93128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* const str[] = {"f", "oo"}; 9446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(0, 1); 95128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 96128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("TokenStraddlingTwoStrings"); 97c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(2, str, NULL, loc); 98128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 99128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 100fc8b72005b887731ca97db23354e61bdad4d8cd9alokp@chromium.orgTEST_F(LocationTest, TokenStraddlingThreeStrings) 101128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org{ 102128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org const char* const str[] = {"f", "o", "o"}; 10346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(0, 1); 104128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 105128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org SCOPED_TRACE("TokenStraddlingThreeStrings"); 106c745adb0b20dca8f0ac3c425733d51b3c5b623d3alokp@chromium.org expectLocation(3, str, NULL, loc); 10719d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org} 10819d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 10919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.orgTEST_F(LocationTest, EndOfFileWithoutNewline) 11019d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org{ 11119d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org const char* const str[] = {"foo"}; 11219d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(1, str, NULL)); 11319d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 11419d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org pp::Token token; 11519d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org mPreprocessor.lex(&token); 11619d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(pp::Token::IDENTIFIER, token.type); 1175b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org EXPECT_EQ("foo", token.text); 11819d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(0, token.location.file); 11919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(1, token.location.line); 12019d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 12119d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org mPreprocessor.lex(&token); 12219d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(pp::Token::LAST, token.type); 12319d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(0, token.location.file); 12419d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(1, token.location.line); 12519d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org} 12619d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 12719d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.orgTEST_F(LocationTest, EndOfFileAfterNewline) 12819d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org{ 12919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org const char* const str[] = {"foo\n"}; 13019d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(1, str, NULL)); 13119d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 13219d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org pp::Token token; 13319d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org mPreprocessor.lex(&token); 13419d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(pp::Token::IDENTIFIER, token.type); 1355b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org EXPECT_EQ("foo", token.text); 13619d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(0, token.location.file); 13719d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(1, token.location.line); 13819d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 13919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org mPreprocessor.lex(&token); 14019d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(pp::Token::LAST, token.type); 14119d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(0, token.location.file); 14219d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(2, token.location.line); 14319d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org} 14419d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 14519d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.orgTEST_F(LocationTest, EndOfFileAfterEmptyString) 14619d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org{ 14719d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org const char* const str[] = {"foo\n", "\n", ""}; 14819d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(3, str, NULL)); 14919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 15019d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org pp::Token token; 15119d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org mPreprocessor.lex(&token); 15219d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(pp::Token::IDENTIFIER, token.type); 1535b6a68e04a7d27dab71524fa481f42818f84a240alokp@chromium.org EXPECT_EQ("foo", token.text); 15419d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(0, token.location.file); 15519d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(1, token.location.line); 15619d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org 15719d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org mPreprocessor.lex(&token); 15819d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(pp::Token::LAST, token.type); 15919d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(2, token.location.file); 16019d7aa60c6da3612f60d6c5c3ff7b6077619e167alokp@chromium.org EXPECT_EQ(1, token.location.line); 161128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org} 162128d91995c3f8066bb9b59b5a0f581c99aee51bcalokp@chromium.org 16346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_F(LocationTest, ValidLineDirective1) 16446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 16546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* str = "#line 10\n" 16646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "foo"; 16746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(0, 10); 16846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 16946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org SCOPED_TRACE("ValidLineDirective1"); 17046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org expectLocation(1, &str, NULL, loc); 17146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 17246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 17346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_F(LocationTest, ValidLineDirective2) 17446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 17546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* str = "#line 10 20\n" 17646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "foo"; 17746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(20, 10); 17846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 17946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org SCOPED_TRACE("ValidLineDirective2"); 18046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org expectLocation(1, &str, NULL, loc); 18146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 18246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 18346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_F(LocationTest, LineDirectiveCommentsIgnored) 18446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 18546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* str = "/* bar */" 18646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "#" 18746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "/* bar */" 18846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "line" 18946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "/* bar */" 19046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "10" 19146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "/* bar */" 19246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "20" 19346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "/* bar */" 19446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "// bar " 19546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "\n" 19646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "foo"; 19746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(20, 10); 19846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 19946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org SCOPED_TRACE("LineDirectiveCommentsIgnored"); 20046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org expectLocation(1, &str, NULL, loc); 20146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 20246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 203f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(LocationTest, LineDirectiveWithMacro1) 20446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 20546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* str = "#define L 10\n" 20646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "#define F(x) x\n" 20746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "#line L F(20)\n" 20846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org "foo"; 20946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(20, 10); 21046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 211f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org SCOPED_TRACE("LineDirectiveWithMacro1"); 212f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org expectLocation(1, &str, NULL, loc); 213f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org} 214f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org 215f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(LocationTest, LineDirectiveWithMacro2) 216f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{ 217f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org const char* str = "#define LOC 10 20\n" 218f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "#line LOC\n" 219f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "foo"; 220f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation loc(20, 10); 221f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org 222f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org SCOPED_TRACE("LineDirectiveWithMacro2"); 223f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org expectLocation(1, &str, NULL, loc); 224f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org} 225f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org 226f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.orgTEST_F(LocationTest, LineDirectiveWithPredefinedMacro) 227f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org{ 228f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org const char* str = "#line __LINE__ __FILE__\n" 229f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org "foo"; 230f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org pp::SourceLocation loc(0, 1); 231f3cdb460d1dde723815eecd006274a3da5d81099alokp@chromium.org 23246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org SCOPED_TRACE("LineDirectiveWithMacro"); 23346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org expectLocation(1, &str, NULL, loc); 23446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 23546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 23646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_F(LocationTest, LineDirectiveNewlineBeforeStringBreak) 23746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 23846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* const str[] = {"#line 10 20\n", "foo"}; 23946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org // String number is incremented after it is set by the line directive. 24046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org // Also notice that line number is reset after the string break. 24146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(21, 1); 24246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 24346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org SCOPED_TRACE("LineDirectiveNewlineBeforeStringBreak"); 24446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org expectLocation(2, str, NULL, loc); 24546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 24646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 24746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_F(LocationTest, LineDirectiveNewlineAfterStringBreak) 24846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 24946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* const str[] = {"#line 10 20", "\nfoo"}; 25046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org // String number is incremented before it is set by the line directive. 25146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::SourceLocation loc(20, 10); 25246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 25346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org SCOPED_TRACE("LineDirectiveNewlineAfterStringBreak"); 25446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org expectLocation(2, str, NULL, loc); 25546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 25646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 25746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_F(LocationTest, LineDirectiveMissingNewline) 25846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 25946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* str = "#line 10"; 26046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(1, &str, NULL)); 26146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 26246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org using testing::_; 26346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org // Error reported about EOF. 26446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::EOF_IN_DIRECTIVE, _, _)); 26546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 26646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::Token token; 26746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org mPreprocessor.lex(&token); 26846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 26946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 27046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgstruct LineTestParam 27146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 27246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org const char* str; 27346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::Diagnostics::ID id; 27446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org}; 27546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 27646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgclass InvalidLineTest : public LocationTest, 27746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org public testing::WithParamInterface<LineTestParam> 27846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 27946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org}; 28046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 28146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgTEST_P(InvalidLineTest, Identified) 28246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org{ 28346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org LineTestParam param = GetParam(); 28446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org ASSERT_TRUE(mPreprocessor.init(1, ¶m.str, NULL)); 28546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 28646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org using testing::_; 28746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org // Invalid line directive call. 28846aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org EXPECT_CALL(mDiagnostics, print(param.id, pp::SourceLocation(0, 1), _)); 28946aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 29046aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org pp::Token token; 29146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org mPreprocessor.lex(&token); 29246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org} 29346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 29446aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgstatic const LineTestParam kParams[] = { 29546aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org {"#line\n", pp::Diagnostics::INVALID_LINE_DIRECTIVE}, 29646aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org {"#line foo\n", pp::Diagnostics::INVALID_LINE_NUMBER}, 29746aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org {"#line 10 foo\n", pp::Diagnostics::INVALID_FILE_NUMBER}, 2982e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org {"#line 10 20 foo\n", pp::Diagnostics::UNEXPECTED_TOKEN}, 2992e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org {"#line 0xffffffff\n", pp::Diagnostics::INTEGER_OVERFLOW}, 3002e81891c21bfb199bb53f903bf0967f07efb65d8alokp@chromium.org {"#line 10 0xffffffff\n", pp::Diagnostics::INTEGER_OVERFLOW} 30146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org}; 30246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org 30346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgINSTANTIATE_TEST_CASE_P(All, InvalidLineTest, testing::ValuesIn(kParams)); 304