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));
807095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_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.
2647095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    EXPECT_CALL(mDiagnostics, print(pp::Diagnostics::PP_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, &param.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[] = {
2957095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    {"#line\n", pp::Diagnostics::PP_INVALID_LINE_DIRECTIVE},
2967095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    {"#line foo\n", pp::Diagnostics::PP_INVALID_LINE_NUMBER},
2977095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    {"#line 10 foo\n", pp::Diagnostics::PP_INVALID_FILE_NUMBER},
2987095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    {"#line 10 20 foo\n", pp::Diagnostics::PP_UNEXPECTED_TOKEN},
2997095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    {"#line 0xffffffff\n", pp::Diagnostics::PP_INTEGER_OVERFLOW},
3007095d7a9bc09fa5776913b2ec973d4955b585d77Geoff Lang    {"#line 10 0xffffffff\n", pp::Diagnostics::PP_INTEGER_OVERFLOW}
30146aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org};
30246aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.org
30346aa13d87fdc2da6d36fd14f678f204f8f98ae41alokp@chromium.orgINSTANTIATE_TEST_CASE_P(All, InvalidLineTest, testing::ValuesIn(kParams));
304