diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -549,323 +549,171 @@ } TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) { - auto NumberOfAdditionalRequiresClauseTokens = 5u; - auto NumberOfTokensBeforeRequires = 5u; - - auto BaseTokens = annotate("template\n" - "T Pi = 3.14;"); - auto ConstrainedTokens = annotate("template\n" - " requires Foo\n" - "T Pi = 3.14;"); - - auto NumberOfBaseTokens = 11u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; + const char *BaseCode = nullptr; + const char *ConstrainedCode = nullptr; + auto BaseTokenCount = 0u; + auto RequiresTokenCount = 0u; + auto PrefixTokenCount = 0u; + + auto TestRequires = [&](int Line) { + const auto BaseTokens = annotate(BaseCode); + const auto ConstrainedTokens = annotate(ConstrainedCode); + +#define LINE " (Line " << Line << ')' + + ASSERT_EQ(BaseTokens.size(), BaseTokenCount) << BaseTokens << LINE; + ASSERT_EQ(ConstrainedTokens.size(), BaseTokenCount + RequiresTokenCount) + << LINE; + + for (auto I = 0u; I < BaseTokenCount; ++I) { + EXPECT_EQ( + *BaseTokens[I], + *ConstrainedTokens[I < PrefixTokenCount ? I : I + RequiresTokenCount]) + << I << LINE; } - } - BaseTokens = annotate("template\n" - "struct Bar;"); - ConstrainedTokens = annotate("template\n" - " requires Foo\n" - "struct Bar;"); - NumberOfBaseTokens = 9u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "struct Bar {" - " T foo();\n" - " T bar();\n" - "};"); - ConstrainedTokens = annotate("template\n" - " requires Foo\n" - "struct Bar {" - " T foo();\n" - " T bar();\n" - "};"); - NumberOfBaseTokens = 21u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "Bar(T) -> Bar;"); - ConstrainedTokens = annotate("template\n" - " requires Foo\n" - "Bar(T) -> Bar;"); - NumberOfBaseTokens = 16u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "T foo();"); - ConstrainedTokens = annotate("template\n" - " requires Foo\n" - "T foo();"); - NumberOfBaseTokens = 11u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "T foo() {\n" - " auto bar = baz();\n" - " return bar + T{};\n" - "}"); - ConstrainedTokens = annotate("template\n" - " requires Foo\n" - "T foo() {\n" - " auto bar = baz();\n" - " return bar + T{};\n" - "}"); - NumberOfBaseTokens = 26u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "T foo();"); - ConstrainedTokens = annotate("template\n" - "T foo() requires Foo;"); - NumberOfBaseTokens = 11u; - NumberOfTokensBeforeRequires = 9u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "T foo() {\n" - " auto bar = baz();\n" - " return bar + T{};\n" - "}"); - ConstrainedTokens = annotate("template\n" - "T foo() requires Foo {\n" - " auto bar = baz();\n" - " return bar + T{};\n" - "}"); - NumberOfBaseTokens = 26u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("template\n" - "Bar(T) -> Bar;"); - ConstrainedTokens = annotate("template\n" - " requires requires(T &&t) {\n" - " typename T::I;\n" - " }\n" - "Bar(T) -> Bar;"); - NumberOfBaseTokens = 19u; - NumberOfAdditionalRequiresClauseTokens = 14u; - NumberOfTokensBeforeRequires = 5u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("struct [[nodiscard]] zero_t {\n" - " template\n" - " [[nodiscard]] constexpr operator T() const { " - "return number_zero_v; }\n" - "};"); - - ConstrainedTokens = annotate("struct [[nodiscard]] zero_t {\n" - " template\n" - " requires requires { number_zero_v; }\n" - " [[nodiscard]] constexpr operator T() const { " - "return number_zero_v; }\n" - "};"); - NumberOfBaseTokens = 35u; - NumberOfAdditionalRequiresClauseTokens = 9u; - NumberOfTokensBeforeRequires = 13u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("constexpr Foo(Foo const &other)\n" - " : value{other.value} {\n" - " do_magic();\n" - " do_more_magic();\n" - "}"); - - ConstrainedTokens = annotate("constexpr Foo(Foo const &other)\n" - " requires std::is_copy_constructible\n" - " : value{other.value} {\n" - " do_magic();\n" - " do_more_magic();\n" - "}"); - - NumberOfBaseTokens = 26u; - NumberOfAdditionalRequiresClauseTokens = 7u; - NumberOfTokensBeforeRequires = 8u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } - - BaseTokens = annotate("constexpr Foo(Foo const &other)\n" - " : value{other.value} {\n" - " do_magic();\n" - " do_more_magic();\n" - "}"); - - ConstrainedTokens = annotate("constexpr Foo(Foo const &other)\n" - " requires (std::is_copy_constructible)\n" - " : value{other.value} {\n" - " do_magic();\n" - " do_more_magic();\n" - "}"); - - NumberOfBaseTokens = 26u; - NumberOfAdditionalRequiresClauseTokens = 9u; - NumberOfTokensBeforeRequires = 8u; - - ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens; - ASSERT_EQ(ConstrainedTokens.size(), - NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens) - << ConstrainedTokens; - - for (auto I = 0u; I < NumberOfBaseTokens; ++I) { - if (I < NumberOfTokensBeforeRequires) { - EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I; - } else { - EXPECT_EQ(*BaseTokens[I], - *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens]) - << I; - } - } +#undef LINE + }; + + BaseCode = "template\n" + "T Pi = 3.14;"; + ConstrainedCode = "template\n" + " requires Foo\n" + "T Pi = 3.14;"; + BaseTokenCount = 11; + RequiresTokenCount = 5; + PrefixTokenCount = 5; + TestRequires(__LINE__); + + BaseCode = "template\n" + "struct Bar;"; + ConstrainedCode = "template\n" + " requires Foo\n" + "struct Bar;"; + BaseTokenCount = 9; + TestRequires(__LINE__); + + BaseCode = "template\n" + "struct Bar {\n" + " T foo();\n" + " T bar();\n" + "};"; + ConstrainedCode = "template\n" + " requires Foo\n" + "struct Bar {\n" + " T foo();\n" + " T bar();\n" + "};"; + BaseTokenCount = 21; + TestRequires(__LINE__); + + BaseCode = "template\n" + "Bar(T) -> Bar;"; + ConstrainedCode = "template\n" + " requires Foo\n" + "Bar(T) -> Bar;"; + BaseTokenCount = 16; + TestRequires(__LINE__); + + BaseCode = "template\n" + "T foo();"; + ConstrainedCode = "template\n" + " requires Foo\n" + "T foo();"; + BaseTokenCount = 11; + TestRequires(__LINE__); + + BaseCode = "template\n" + "T foo() {\n" + " auto bar = baz();\n" + " return bar + T{};\n" + "}"; + ConstrainedCode = "template\n" + " requires Foo\n" + "T foo() {\n" + " auto bar = baz();\n" + " return bar + T{};\n" + "}"; + BaseTokenCount = 26; + TestRequires(__LINE__); + + BaseCode = "template\n" + "T foo();"; + ConstrainedCode = "template\n" + "T foo() requires Foo;"; + BaseTokenCount = 11; + PrefixTokenCount = 9; + TestRequires(__LINE__); + + BaseCode = "template\n" + "T foo() {\n" + " auto bar = baz();\n" + " return bar + T{};\n" + "}"; + ConstrainedCode = "template\n" + "T foo() requires Foo {\n" + " auto bar = baz();\n" + " return bar + T{};\n" + "}"; + BaseTokenCount = 26; + TestRequires(__LINE__); + + BaseCode = "template\n" + "Bar(T) -> Bar;"; + ConstrainedCode = "template\n" + " requires requires(T &&t) {\n" + " typename T::I;\n" + " }\n" + "Bar(T) -> Bar;"; + BaseTokenCount = 19; + RequiresTokenCount = 14; + PrefixTokenCount = 5; + TestRequires(__LINE__); + + BaseCode = "struct [[nodiscard]] zero_t {\n" + " template\n" + " [[nodiscard]] constexpr operator T() const { return v; }\n" + "};"; + ConstrainedCode = + "struct [[nodiscard]] zero_t {\n" + " template\n" + " requires requires { v; }\n" + " [[nodiscard]] constexpr operator T() const { return v; }\n" + "};"; + BaseTokenCount = 35; + RequiresTokenCount = 9; + PrefixTokenCount = 13; + TestRequires(__LINE__); + + BaseCode = "constexpr Foo(Foo const &other)\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"; + ConstrainedCode = "constexpr Foo(Foo const &other)\n" + " requires std::is_copy_constructible\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"; + BaseTokenCount = 26; + RequiresTokenCount = 7; + PrefixTokenCount = 8; + TestRequires(__LINE__); + + BaseCode = "constexpr Foo(Foo const &other)\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"; + ConstrainedCode = "constexpr Foo(Foo const &other)\n" + " requires (std::is_copy_constructible)\n" + " : value{other.value} {\n" + " do_magic();\n" + " do_more_magic();\n" + "}"; + RequiresTokenCount = 9; + TestRequires(__LINE__); } TEST_F(TokenAnnotatorTest, UnderstandsAsm) {