xref: /llvm-project/clang/unittests/Format/FormatTestTableGen.cpp (revision c1ec5beb4ab36c2c4d99ed6d735d217e74364771)
1054dc28aSJordan Rupprecht //===- unittest/Format/FormatTestTableGen.cpp -----------------------------===//
2054dc28aSJordan Rupprecht //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6054dc28aSJordan Rupprecht //
7054dc28aSJordan Rupprecht //===----------------------------------------------------------------------===//
8054dc28aSJordan Rupprecht 
9054dc28aSJordan Rupprecht #include "FormatTestUtils.h"
10054dc28aSJordan Rupprecht #include "clang/Format/Format.h"
11054dc28aSJordan Rupprecht #include "llvm/Support/Debug.h"
12054dc28aSJordan Rupprecht #include "gtest/gtest.h"
13054dc28aSJordan Rupprecht 
14054dc28aSJordan Rupprecht #define DEBUG_TYPE "format-test"
15054dc28aSJordan Rupprecht 
16054dc28aSJordan Rupprecht namespace clang {
17054dc28aSJordan Rupprecht namespace format {
18054dc28aSJordan Rupprecht 
191c58208dSOwen Pan class FormatTestTableGen : public testing::Test {
20054dc28aSJordan Rupprecht protected:
211c58208dSOwen Pan   static std::string format(StringRef Code, unsigned Offset, unsigned Length,
221c58208dSOwen Pan                             const FormatStyle &Style) {
23054dc28aSJordan Rupprecht     LLVM_DEBUG(llvm::errs() << "---\n");
24054dc28aSJordan Rupprecht     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
25054dc28aSJordan Rupprecht     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
26054dc28aSJordan Rupprecht     tooling::Replacements Replaces = reformat(Style, Code, Ranges);
27054dc28aSJordan Rupprecht     auto Result = applyAllReplacements(Code, Replaces);
28054dc28aSJordan Rupprecht     EXPECT_TRUE(static_cast<bool>(Result));
29054dc28aSJordan Rupprecht     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
30054dc28aSJordan Rupprecht     return *Result;
31054dc28aSJordan Rupprecht   }
32054dc28aSJordan Rupprecht 
331c58208dSOwen Pan   static std::string format(StringRef Code) {
34054dc28aSJordan Rupprecht     FormatStyle Style = getGoogleStyle(FormatStyle::LK_TableGen);
35054dc28aSJordan Rupprecht     Style.ColumnLimit = 60; // To make writing tests easier.
36054dc28aSJordan Rupprecht     return format(Code, 0, Code.size(), Style);
37054dc28aSJordan Rupprecht   }
38054dc28aSJordan Rupprecht 
391c58208dSOwen Pan   static void verifyFormat(StringRef Code) {
40054dc28aSJordan Rupprecht     EXPECT_EQ(Code.str(), format(Code)) << "Expected code is not stable";
41054dc28aSJordan Rupprecht     EXPECT_EQ(Code.str(), format(test::messUp(Code)));
42054dc28aSJordan Rupprecht   }
438c1c94e8SHirofumi Nakamura 
441c58208dSOwen Pan   static void verifyFormat(StringRef Result, StringRef MessedUp) {
458c1c94e8SHirofumi Nakamura     EXPECT_EQ(Result, format(MessedUp));
468c1c94e8SHirofumi Nakamura   }
47046682efSHirofumi Nakamura 
481c58208dSOwen Pan   static void verifyFormat(StringRef Code, const FormatStyle &Style) {
49046682efSHirofumi Nakamura     EXPECT_EQ(Code.str(), format(Code, 0, Code.size(), Style))
50046682efSHirofumi Nakamura         << "Expected code is not stable";
51046682efSHirofumi Nakamura     auto MessUp = test::messUp(Code);
52046682efSHirofumi Nakamura     EXPECT_EQ(Code.str(), format(MessUp, 0, MessUp.size(), Style));
53046682efSHirofumi Nakamura   }
54054dc28aSJordan Rupprecht };
55054dc28aSJordan Rupprecht 
56054dc28aSJordan Rupprecht TEST_F(FormatTestTableGen, FormatStringBreak) {
57054dc28aSJordan Rupprecht   verifyFormat("include \"OptParser.td\"\n"
58054dc28aSJordan Rupprecht                "def flag : Flag<\"--foo\">,\n"
59054dc28aSJordan Rupprecht                "           HelpText<\n"
60054dc28aSJordan Rupprecht                "               \"This is a very, very, very, very, \"\n"
61054dc28aSJordan Rupprecht                "               \"very, very, very, very, very, very, \"\n"
626c3bc910SOwen Pan                "               \"very long help string\">;");
63054dc28aSJordan Rupprecht }
64054dc28aSJordan Rupprecht 
657f514164SJordan Rupprecht TEST_F(FormatTestTableGen, NoSpacesInSquareBracketLists) {
666c3bc910SOwen Pan   verifyFormat("def flag : Flag<[\"-\", \"--\"], \"foo\">;");
677f514164SJordan Rupprecht }
687f514164SJordan Rupprecht 
698c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, LiteralsAndIdentifiers) {
708c1c94e8SHirofumi Nakamura   verifyFormat("def LiteralAndIdentifiers {\n"
718c1c94e8SHirofumi Nakamura                "  let someInteger = -42;\n"
728c1c94e8SHirofumi Nakamura                "  let 0startID = $TokVarName;\n"
738c1c94e8SHirofumi Nakamura                "  let 0xstartInteger = 0x42;\n"
748c1c94e8SHirofumi Nakamura                "  let someIdentifier = $TokVarName;\n"
75bf0b21aaSHirofumi Nakamura                "}");
768c1c94e8SHirofumi Nakamura }
778c1c94e8SHirofumi Nakamura 
788c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, BangOperators) {
798c1c94e8SHirofumi Nakamura   verifyFormat("def BangOperators {\n"
808c1c94e8SHirofumi Nakamura                "  let IfOpe = !if(\n"
818c1c94e8SHirofumi Nakamura                "      !not(!and(!gt(!add(1, 2), !sub(3, 4)), !isa<Ty>($x))),\n"
828c1c94e8SHirofumi Nakamura                "      !foldl(0, !listconcat(!range(5, 6), !range(7, 8)),\n"
838c1c94e8SHirofumi Nakamura                "             total, rec, !add(total, rec.Number)),\n"
848c1c94e8SHirofumi Nakamura                "      !tail(!range(9, 10)));\n"
858c1c94e8SHirofumi Nakamura                "  let ForeachOpe = !foreach(\n"
868c1c94e8SHirofumi Nakamura                "      arg, arglist,\n"
878c1c94e8SHirofumi Nakamura                "      !if(!isa<SomeType>(arg.Type),\n"
888c1c94e8SHirofumi Nakamura                "          !add(!cast<SomeOtherType>(arg).Number, x), arg));\n"
898c1c94e8SHirofumi Nakamura                "  let CondOpe1 = !cond(!eq(size, 1): 1,\n"
908c1c94e8SHirofumi Nakamura                "                       !eq(size, 2): 1,\n"
918c1c94e8SHirofumi Nakamura                "                       !eq(size, 4): 1,\n"
928c1c94e8SHirofumi Nakamura                "                       !eq(size, 8): 1,\n"
938c1c94e8SHirofumi Nakamura                "                       !eq(size, 16): 1,\n"
948c1c94e8SHirofumi Nakamura                "                       true: 0);\n"
958c1c94e8SHirofumi Nakamura                "  let CondOpe2 = !cond(!lt(x, 0): \"negativenegative\",\n"
968c1c94e8SHirofumi Nakamura                "                       !eq(x, 0): \"zerozero\",\n"
978c1c94e8SHirofumi Nakamura                "                       true: \"positivepositive\");\n"
988c1c94e8SHirofumi Nakamura                "  let CondOpe2WithComment = !cond(!lt(x, 0):  // negative\n"
998c1c94e8SHirofumi Nakamura                "                                  \"negativenegative\",\n"
1008c1c94e8SHirofumi Nakamura                "                                  !eq(x, 0):  // zero\n"
1018c1c94e8SHirofumi Nakamura                "                                  \"zerozero\",\n"
1028c1c94e8SHirofumi Nakamura                "                                  true:  // default\n"
1038c1c94e8SHirofumi Nakamura                "                                  \"positivepositive\");\n"
104*c1ec5bebSOwen Pan                "  let CondOpe3WithCommentAfterLParen = !cond(\n"
105*c1ec5bebSOwen Pan                "      // comment\n"
106*c1ec5bebSOwen Pan                "      !eq(/* comment */ x, 0): \"zero\");\n"
107bf0b21aaSHirofumi Nakamura                "}");
1088c1c94e8SHirofumi Nakamura }
1098c1c94e8SHirofumi Nakamura 
1108c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Include) {
111bf0b21aaSHirofumi Nakamura   verifyFormat("include \"test/IncludeFile.h\"");
1128c1c94e8SHirofumi Nakamura }
1138c1c94e8SHirofumi Nakamura 
1148c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Types) {
115bf0b21aaSHirofumi Nakamura   verifyFormat("def Types : list<int>, bits<3>, list<list<string>> {}");
1168c1c94e8SHirofumi Nakamura }
1178c1c94e8SHirofumi Nakamura 
1188c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue1_SingleLiterals) {
1198c1c94e8SHirofumi Nakamura   verifyFormat("def SimpleValue {\n"
1208c1c94e8SHirofumi Nakamura                "  let Integer = 42;\n"
1218c1c94e8SHirofumi Nakamura                "  let String = \"some string\";\n"
122bf0b21aaSHirofumi Nakamura                "}");
1238c1c94e8SHirofumi Nakamura }
1248c1c94e8SHirofumi Nakamura 
1258c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue1_MultilineString) {
1268c1c94e8SHirofumi Nakamura   // test::messUp does not understand multiline TableGen code-literals.
1278c1c94e8SHirofumi Nakamura   // We have to give the result and the strings to format manually.
1288c1c94e8SHirofumi Nakamura   StringRef DefWithCode =
1298c1c94e8SHirofumi Nakamura       "def SimpleValueCode {\n"
1308c1c94e8SHirofumi Nakamura       "  let Code =\n"
1318c1c94e8SHirofumi Nakamura       "      [{ A TokCode is  nothing more than a multi-line string literal "
1328c1c94e8SHirofumi Nakamura       "delimited by \\[{ and }\\]. It  can break across lines and the line "
1338c1c94e8SHirofumi Nakamura       "breaks are retained in the string. \n"
1348c1c94e8SHirofumi Nakamura       "(https://llvm.org/docs/TableGen/ProgRef.html#grammar-token-TokCode)}];\n"
135bf0b21aaSHirofumi Nakamura       "}";
1368c1c94e8SHirofumi Nakamura   StringRef DefWithCodeMessedUp =
1378c1c94e8SHirofumi Nakamura       "def SimpleValueCode {  let  \n"
1388c1c94e8SHirofumi Nakamura       "Code=       \n"
1398c1c94e8SHirofumi Nakamura       "               [{ A TokCode is  nothing more than a multi-line string "
1408c1c94e8SHirofumi Nakamura       "literal "
1418c1c94e8SHirofumi Nakamura       "delimited by \\[{ and }\\]. It  can break across lines and the line "
1428c1c94e8SHirofumi Nakamura       "breaks are retained in the string. \n"
1438c1c94e8SHirofumi Nakamura       "(https://llvm.org/docs/TableGen/ProgRef.html#grammar-token-TokCode)}] \n"
1448c1c94e8SHirofumi Nakamura       " ;  \n"
145bf0b21aaSHirofumi Nakamura       "   }    ";
1468c1c94e8SHirofumi Nakamura   verifyFormat(DefWithCode, DefWithCodeMessedUp);
1478c1c94e8SHirofumi Nakamura }
1488c1c94e8SHirofumi Nakamura 
1498c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue2) {
1508c1c94e8SHirofumi Nakamura   verifyFormat("def SimpleValue2 {\n"
1518c1c94e8SHirofumi Nakamura                "  let True = true;\n"
1528c1c94e8SHirofumi Nakamura                "  let False = false;\n"
153bf0b21aaSHirofumi Nakamura                "}");
1548c1c94e8SHirofumi Nakamura }
1558c1c94e8SHirofumi Nakamura 
1568c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue3) {
157bf0b21aaSHirofumi Nakamura   verifyFormat("class SimpleValue3<int x> { int Question = ?; }");
1588c1c94e8SHirofumi Nakamura }
1598c1c94e8SHirofumi Nakamura 
1608c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue4) {
161bf0b21aaSHirofumi Nakamura   verifyFormat("def SimpleValue4 { let ValueList = {1, 2, 3}; }");
1628c1c94e8SHirofumi Nakamura }
1638c1c94e8SHirofumi Nakamura 
1648c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue5) {
1658c1c94e8SHirofumi Nakamura   verifyFormat("def SimpleValue5 {\n"
1668c1c94e8SHirofumi Nakamura                "  let SquareList = [1, 4, 9];\n"
1678c1c94e8SHirofumi Nakamura                "  let SquareListWithType = [\"a\", \"b\", \"c\"]<string>;\n"
1688c1c94e8SHirofumi Nakamura                "  let SquareListListWithType = [[1, 2], [3, 4, 5], [7]]<\n"
1698c1c94e8SHirofumi Nakamura                "      list<int>>;\n"
1708c1c94e8SHirofumi Nakamura                "  let SquareBitsListWithType = [ {1, 2},\n"
1718c1c94e8SHirofumi Nakamura                "                                 {3, 4} ]<list<bits<8>>>;\n"
172bf0b21aaSHirofumi Nakamura                "}");
1738c1c94e8SHirofumi Nakamura }
1748c1c94e8SHirofumi Nakamura 
1758c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue6) {
1768c1c94e8SHirofumi Nakamura   verifyFormat("def SimpleValue6 {\n"
1778c1c94e8SHirofumi Nakamura                "  let DAGArgIns = (ins i32:$src1, i32:$src2);\n"
1788c1c94e8SHirofumi Nakamura                "  let DAGArgOuts = (outs i32:$dst1, i32:$dst2, i32:$dst3,\n"
1798c1c94e8SHirofumi Nakamura                "      i32:$dst4, i32:$dst5, i32:$dst6, i32:$dst7);\n"
1808c1c94e8SHirofumi Nakamura                "  let DAGArgOutsWithComment = (outs i32:$dst1,  // dst1\n"
1818c1c94e8SHirofumi Nakamura                "      i32:$dst2,                                // dst2\n"
1828c1c94e8SHirofumi Nakamura                "      i32:$dst3,                                // dst3\n"
1838c1c94e8SHirofumi Nakamura                "      i32:$dst4,                                // dst4\n"
1848c1c94e8SHirofumi Nakamura                "      i32:$dst5,                                // dst5\n"
1858c1c94e8SHirofumi Nakamura                "      i32:$dst6,                                // dst6\n"
1868c1c94e8SHirofumi Nakamura                "      i32:$dst7                                 // dst7\n"
1878c1c94e8SHirofumi Nakamura                "  );\n"
1888c1c94e8SHirofumi Nakamura                "  let DAGArgBang = (!cast<SomeType>(\"Some\") i32:$src1,\n"
1898c1c94e8SHirofumi Nakamura                "      i32:$src2);\n"
190bf0b21aaSHirofumi Nakamura                "}");
1918c1c94e8SHirofumi Nakamura }
1928c1c94e8SHirofumi Nakamura 
1938c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue7) {
194bf0b21aaSHirofumi Nakamura   verifyFormat("def SimpleValue7 { let Identifier = SimpleValue; }");
1958c1c94e8SHirofumi Nakamura }
1968c1c94e8SHirofumi Nakamura 
1978c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, SimpleValue8) {
198bf0b21aaSHirofumi Nakamura   verifyFormat("def SimpleValue8 { let Class = SimpleValue3<3>; }");
1998c1c94e8SHirofumi Nakamura }
2008c1c94e8SHirofumi Nakamura 
2018c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, ValueSuffix) {
2028c1c94e8SHirofumi Nakamura   verifyFormat("def SuffixedValues {\n"
2038c1c94e8SHirofumi Nakamura                "  let Bit = value{17};\n"
2048c1c94e8SHirofumi Nakamura                "  let Bits = value{8...15};\n"
2058c1c94e8SHirofumi Nakamura                "  let List = value[1];\n"
2068c1c94e8SHirofumi Nakamura                "  let Slice1 = value[1, ];\n"
2078c1c94e8SHirofumi Nakamura                "  let Slice2 = value[4...7, 17, 2...3, 4];\n"
2088c1c94e8SHirofumi Nakamura                "  let Field = value.field;\n"
209bf0b21aaSHirofumi Nakamura                "}");
2108c1c94e8SHirofumi Nakamura }
2118c1c94e8SHirofumi Nakamura 
2128c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, PasteOperator) {
213bf0b21aaSHirofumi Nakamura   verifyFormat("def Paste#\"Operator\" { string Paste = \"Paste\"#operator; }");
2148c1c94e8SHirofumi Nakamura 
2158c1c94e8SHirofumi Nakamura   verifyFormat("def [\"Traring\", \"Paste\"]# {\n"
2168c1c94e8SHirofumi Nakamura                "  string X = Traring#;\n"
2178c1c94e8SHirofumi Nakamura                "  string Y = List<\"Operator\">#;\n"
2188c1c94e8SHirofumi Nakamura                "  string Z = [\"Traring\", \"Paste\", \"Traring\", \"Paste\",\n"
2198c1c94e8SHirofumi Nakamura                "              \"Traring\", \"Paste\"]#;\n"
220bf0b21aaSHirofumi Nakamura                "}");
2218c1c94e8SHirofumi Nakamura }
2228c1c94e8SHirofumi Nakamura 
2238c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, ClassDefinition) {
2248c1c94e8SHirofumi Nakamura   verifyFormat("class Class<int x, int y = 1, string z = \"z\", int w = -1>\n"
2258c1c94e8SHirofumi Nakamura                "    : Parent1, Parent2<x, y> {\n"
2268c1c94e8SHirofumi Nakamura                "  int Item1 = 1;\n"
2278c1c94e8SHirofumi Nakamura                "  int Item2;\n"
2288c1c94e8SHirofumi Nakamura                "  code Item3 = [{ Item3 }];\n"
2298c1c94e8SHirofumi Nakamura                "  let Item4 = 4;\n"
2308c1c94e8SHirofumi Nakamura                "  let Item5{1, 2} = 5;\n"
2318c1c94e8SHirofumi Nakamura                "  defvar Item6 = 6;\n"
2328c1c94e8SHirofumi Nakamura                "  let Item7 = ?;\n"
2338c1c94e8SHirofumi Nakamura                "  assert !ge(x, 0), \"Assert7\";\n"
234bf0b21aaSHirofumi Nakamura                "}");
2358c1c94e8SHirofumi Nakamura 
236bf0b21aaSHirofumi Nakamura   verifyFormat("class FPFormat<bits<3> val> { bits<3> Value = val; }");
2378c1c94e8SHirofumi Nakamura }
2388c1c94e8SHirofumi Nakamura 
2398c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Def) {
2408c1c94e8SHirofumi Nakamura   verifyFormat("def Def : Parent1<Def>, Parent2(defs Def) {\n"
2418c1c94e8SHirofumi Nakamura                "  code Item1 = [{ Item1 }];\n"
2428c1c94e8SHirofumi Nakamura                "  let Item2{1, 3...4} = {1, 2};\n"
2438c1c94e8SHirofumi Nakamura                "  defvar Item3 = (ops nodty:$node1, nodty:$node2);\n"
2448c1c94e8SHirofumi Nakamura                "  assert !le(Item2, 0), \"Assert4\";\n"
245bf0b21aaSHirofumi Nakamura                "}");
2468c1c94e8SHirofumi Nakamura 
247bf0b21aaSHirofumi Nakamura   verifyFormat("class FPFormat<bits<3> val> { bits<3> Value = val; }");
2488c1c94e8SHirofumi Nakamura 
249bf0b21aaSHirofumi Nakamura   verifyFormat("def NotFP : FPFormat<0>;");
2508c1c94e8SHirofumi Nakamura }
2518c1c94e8SHirofumi Nakamura 
2528c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Let) {
2538c1c94e8SHirofumi Nakamura   verifyFormat("let x = 1, y = value<type>,\n"
2548c1c94e8SHirofumi Nakamura                "    z = !and(!gt(!add(1, 2), !sub(3, 4)), !isa<Ty>($x)) in {\n"
2558c1c94e8SHirofumi Nakamura                "  class Class1 : Parent<x, y> { let Item1 = z; }\n"
256bf0b21aaSHirofumi Nakamura                "}");
2578c1c94e8SHirofumi Nakamura }
2588c1c94e8SHirofumi Nakamura 
2598c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, MultiClass) {
2608c1c94e8SHirofumi Nakamura   verifyFormat("multiclass Multiclass<int x> {\n"
2618c1c94e8SHirofumi Nakamura                "  def : Def1<(item type:$src1),\n"
2628c1c94e8SHirofumi Nakamura                "             (!if(!ge(x, 0), !mul(!add(x, 1), !sub(x, 2)),\n"
2638c1c94e8SHirofumi Nakamura                "                  !sub(x, 2)))>;\n"
2648c1c94e8SHirofumi Nakamura                "  def Def2 : value<type>;\n"
2658c1c94e8SHirofumi Nakamura                "  def Def3 : type { let value = 1; }\n"
2668c1c94e8SHirofumi Nakamura                "  defm : SomeMultiClass<Def1, Def2>;\n"
2678c1c94e8SHirofumi Nakamura                "  defvar DefVar = 6;\n"
2688c1c94e8SHirofumi Nakamura                "  foreach i = [1, 2, 3] in {\n"
2698c1c94e8SHirofumi Nakamura                "    def : Foreach#i<(item type:$src1),\n"
2708c1c94e8SHirofumi Nakamura                "                    (!if(!gt(x, i),\n"
2718c1c94e8SHirofumi Nakamura                "                         !mul(!add(x, i), !sub(x, i)),\n"
2728c1c94e8SHirofumi Nakamura                "                         !sub(x, !add(i, 1))))>;\n"
2738c1c94e8SHirofumi Nakamura                "  }\n"
2748c1c94e8SHirofumi Nakamura                "  if !gt(x, 0) then {\n"
2758c1c94e8SHirofumi Nakamura                "    def : IfThen<x>;\n"
2768c1c94e8SHirofumi Nakamura                "  } else {\n"
2778c1c94e8SHirofumi Nakamura                "    def : IfElse<x>;\n"
2788c1c94e8SHirofumi Nakamura                "  }\n"
2798c1c94e8SHirofumi Nakamura                "  if (dagid x, 0) then {\n"
2808c1c94e8SHirofumi Nakamura                "    def : If2<1>;\n"
2818c1c94e8SHirofumi Nakamura                "  }\n"
2828c1c94e8SHirofumi Nakamura                "  let y = 1, z = 2 in {\n"
2838c1c94e8SHirofumi Nakamura                "    multiclass Multiclass2<int x> {\n"
2848c1c94e8SHirofumi Nakamura                "      foreach i = [1, 2, 3] in {\n"
2858c1c94e8SHirofumi Nakamura                "        def : Foreach#i<(item type:$src1),\n"
2868c1c94e8SHirofumi Nakamura                "                        (!if(!gt(z, i),\n"
2878c1c94e8SHirofumi Nakamura                "                             !mul(!add(y, i), !sub(x, i)),\n"
2888c1c94e8SHirofumi Nakamura                "                             !sub(z, !add(i, 1))))>;\n"
2898c1c94e8SHirofumi Nakamura                "      }\n"
2908c1c94e8SHirofumi Nakamura                "    }\n"
2918c1c94e8SHirofumi Nakamura                "  }\n"
292bf0b21aaSHirofumi Nakamura                "}");
2938c1c94e8SHirofumi Nakamura }
2948c1c94e8SHirofumi Nakamura 
2955a855d51SHirofumi Nakamura TEST_F(FormatTestTableGen, MultiClassesWithPasteOperator) {
2965a855d51SHirofumi Nakamura   // This is a sensitive example for the handling of the paste operators in
2975a855d51SHirofumi Nakamura   // brace type calculation.
2985a855d51SHirofumi Nakamura   verifyFormat("multiclass MultiClass1<int i> {\n"
2995a855d51SHirofumi Nakamura                "  def : Def#x<i>;\n"
3005a855d51SHirofumi Nakamura                "  def : Def#y<i>;\n"
3015a855d51SHirofumi Nakamura                "}\n"
302bf0b21aaSHirofumi Nakamura                "multiclass MultiClass2<int i> { def : Def#x<i>; }");
3035a855d51SHirofumi Nakamura }
3045a855d51SHirofumi Nakamura 
3058c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Defm) {
306bf0b21aaSHirofumi Nakamura   verifyFormat("defm : Multiclass<0>;");
3078c1c94e8SHirofumi Nakamura 
308bf0b21aaSHirofumi Nakamura   verifyFormat("defm Defm1 : Multiclass<1>;");
3098c1c94e8SHirofumi Nakamura }
3108c1c94e8SHirofumi Nakamura 
3118c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Defset) {
3128c1c94e8SHirofumi Nakamura   verifyFormat("defset list<Class> DefSet1 = {\n"
3138c1c94e8SHirofumi Nakamura                "  def Def1 : Class<1>;\n"
3148c1c94e8SHirofumi Nakamura                "  def Def2 : Class<2>;\n"
315bf0b21aaSHirofumi Nakamura                "}");
3168c1c94e8SHirofumi Nakamura }
3178c1c94e8SHirofumi Nakamura 
3188c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Defvar) {
3198c1c94e8SHirofumi Nakamura   verifyFormat("defvar DefVar1 = !cond(!ge(!size(PaseOperator.Paste), 1): 1,\n"
320bf0b21aaSHirofumi Nakamura                "                       true: 0);");
3218c1c94e8SHirofumi Nakamura }
3228c1c94e8SHirofumi Nakamura 
3238c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, ForEach) {
3248c1c94e8SHirofumi Nakamura   verifyFormat(
3258c1c94e8SHirofumi Nakamura       "foreach i = [1, 2, 3] in {\n"
3268c1c94e8SHirofumi Nakamura       "  def : Foreach#i<(item type:$src1),\n"
3278c1c94e8SHirofumi Nakamura       "                  (!if(!lt(x, i),\n"
3288c1c94e8SHirofumi Nakamura       "                       !shl(!mul(x, i), !size(\"string\")),\n"
3298c1c94e8SHirofumi Nakamura       "                       !size(!strconcat(\"a\", \"b\", \"c\"))))>;\n"
330bf0b21aaSHirofumi Nakamura       "}");
3318c1c94e8SHirofumi Nakamura }
3328c1c94e8SHirofumi Nakamura 
333bf0b21aaSHirofumi Nakamura TEST_F(FormatTestTableGen, Dump) { verifyFormat("dump \"Dump\";"); }
3348c1c94e8SHirofumi Nakamura 
3358c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, If) {
3368c1c94e8SHirofumi Nakamura   verifyFormat("if !gt(x, 0) then {\n"
3378c1c94e8SHirofumi Nakamura                "  def : IfThen<x>;\n"
3388c1c94e8SHirofumi Nakamura                "} else {\n"
3398c1c94e8SHirofumi Nakamura                "  def : IfElse<x>;\n"
340bf0b21aaSHirofumi Nakamura                "}");
3418c1c94e8SHirofumi Nakamura }
3428c1c94e8SHirofumi Nakamura 
3438c1c94e8SHirofumi Nakamura TEST_F(FormatTestTableGen, Assert) {
344bf0b21aaSHirofumi Nakamura   verifyFormat("assert !le(DefVar1, 0), \"Assert1\";");
3458c1c94e8SHirofumi Nakamura }
3468c1c94e8SHirofumi Nakamura 
3470c423af5SHirofumi Nakamura TEST_F(FormatTestTableGen, DAGArgBreakElements) {
3480c423af5SHirofumi Nakamura   FormatStyle Style = getGoogleStyle(FormatStyle::LK_TableGen);
3490c423af5SHirofumi Nakamura   Style.ColumnLimit = 60;
3500c423af5SHirofumi Nakamura   // By default, the DAGArg does not have a break inside.
3510c423af5SHirofumi Nakamura   ASSERT_EQ(Style.TableGenBreakInsideDAGArg, FormatStyle::DAS_DontBreak);
3520c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3530c423af5SHirofumi Nakamura                "  let dagarg = (ins a:$src1, aa:$src2, aaa:$src3)\n"
354bf0b21aaSHirofumi Nakamura                "}",
3550c423af5SHirofumi Nakamura                Style);
3560c423af5SHirofumi Nakamura   // This option forces to break inside the DAGArg.
3570c423af5SHirofumi Nakamura   Style.TableGenBreakInsideDAGArg = FormatStyle::DAS_BreakElements;
3580c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3590c423af5SHirofumi Nakamura                "  let dagarg = (ins a:$src1,\n"
3600c423af5SHirofumi Nakamura                "                    aa:$src2,\n"
3610c423af5SHirofumi Nakamura                "                    aaa:$src3);\n"
362bf0b21aaSHirofumi Nakamura                "}",
3630c423af5SHirofumi Nakamura                Style);
3640c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3650c423af5SHirofumi Nakamura                "  let dagarg = (other a:$src1,\n"
3660c423af5SHirofumi Nakamura                "                      aa:$src2,\n"
3670c423af5SHirofumi Nakamura                "                      aaa:$src3);\n"
368bf0b21aaSHirofumi Nakamura                "}",
3690c423af5SHirofumi Nakamura                Style);
3700c423af5SHirofumi Nakamura   // Then, limit the DAGArg operator only to "ins".
3710c423af5SHirofumi Nakamura   Style.TableGenBreakingDAGArgOperators = {"ins"};
3720c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3730c423af5SHirofumi Nakamura                "  let dagarg = (ins a:$src1,\n"
3740c423af5SHirofumi Nakamura                "                    aa:$src2,\n"
3750c423af5SHirofumi Nakamura                "                    aaa:$src3);\n"
376bf0b21aaSHirofumi Nakamura                "}",
3770c423af5SHirofumi Nakamura                Style);
3780c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3790c423af5SHirofumi Nakamura                "  let dagarg = (other a:$src1, aa:$src2, aaa:$src3)\n"
380bf0b21aaSHirofumi Nakamura                "}",
3810c423af5SHirofumi Nakamura                Style);
3820c423af5SHirofumi Nakamura }
3830c423af5SHirofumi Nakamura 
3840c423af5SHirofumi Nakamura TEST_F(FormatTestTableGen, DAGArgBreakAll) {
3850c423af5SHirofumi Nakamura   FormatStyle Style = getGoogleStyle(FormatStyle::LK_TableGen);
3860c423af5SHirofumi Nakamura   Style.ColumnLimit = 60;
3870c423af5SHirofumi Nakamura   // By default, the DAGArg does not have a break inside.
3880c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3890c423af5SHirofumi Nakamura                "  let dagarg = (ins a:$src1, aa:$src2, aaa:$src3)\n"
390bf0b21aaSHirofumi Nakamura                "}",
3910c423af5SHirofumi Nakamura                Style);
3920c423af5SHirofumi Nakamura   // This option forces to break inside the DAGArg.
3930c423af5SHirofumi Nakamura   Style.TableGenBreakInsideDAGArg = FormatStyle::DAS_BreakAll;
3940c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
3950c423af5SHirofumi Nakamura                "  let dagarg = (ins\n"
3960c423af5SHirofumi Nakamura                "      a:$src1,\n"
3970c423af5SHirofumi Nakamura                "      aa:$src2,\n"
3980c423af5SHirofumi Nakamura                "      aaa:$src3\n"
3990c423af5SHirofumi Nakamura                "  );\n"
400bf0b21aaSHirofumi Nakamura                "}",
4010c423af5SHirofumi Nakamura                Style);
4020c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
4030c423af5SHirofumi Nakamura                "  let dagarg = (other\n"
4040c423af5SHirofumi Nakamura                "      a:$src1,\n"
4050c423af5SHirofumi Nakamura                "      aa:$src2,\n"
4060c423af5SHirofumi Nakamura                "      aaa:$src3\n"
4070c423af5SHirofumi Nakamura                "  );\n"
408bf0b21aaSHirofumi Nakamura                "}",
4090c423af5SHirofumi Nakamura                Style);
4100c423af5SHirofumi Nakamura   // Then, limit the DAGArg operator only to "ins".
4110c423af5SHirofumi Nakamura   Style.TableGenBreakingDAGArgOperators = {"ins"};
4120c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
4130c423af5SHirofumi Nakamura                "  let dagarg = (ins\n"
4140c423af5SHirofumi Nakamura                "      a:$src1,\n"
4150c423af5SHirofumi Nakamura                "      aa:$src2,\n"
4160c423af5SHirofumi Nakamura                "      aaa:$src3\n"
4170c423af5SHirofumi Nakamura                "  );\n"
418bf0b21aaSHirofumi Nakamura                "}",
4190c423af5SHirofumi Nakamura                Style);
4200c423af5SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
4210c423af5SHirofumi Nakamura                "  let dagarg = (other a:$src1, aa:$src2, aaa:$src3);\n"
422bf0b21aaSHirofumi Nakamura                "}",
4230c423af5SHirofumi Nakamura                Style);
4240c423af5SHirofumi Nakamura }
4250c423af5SHirofumi Nakamura 
426e54af608SHirofumi Nakamura TEST_F(FormatTestTableGen, DAGArgAlignment) {
427e54af608SHirofumi Nakamura   FormatStyle Style = getGoogleStyle(FormatStyle::LK_TableGen);
428e54af608SHirofumi Nakamura   Style.ColumnLimit = 60;
429e54af608SHirofumi Nakamura   Style.TableGenBreakInsideDAGArg = FormatStyle::DAS_BreakAll;
430e54af608SHirofumi Nakamura   Style.TableGenBreakingDAGArgOperators = {"ins", "outs"};
431e54af608SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
432e54af608SHirofumi Nakamura                "  let dagarg = (ins\n"
433e54af608SHirofumi Nakamura                "      a:$src1,\n"
434e54af608SHirofumi Nakamura                "      aa:$src2,\n"
435e54af608SHirofumi Nakamura                "      aaa:$src3\n"
436e54af608SHirofumi Nakamura                "  )\n"
437bf0b21aaSHirofumi Nakamura                "}",
438e54af608SHirofumi Nakamura                Style);
439e54af608SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
440e54af608SHirofumi Nakamura                "  let dagarg = (not a:$src1, aa:$src2, aaa:$src2)\n"
441bf0b21aaSHirofumi Nakamura                "}",
442e54af608SHirofumi Nakamura                Style);
443e54af608SHirofumi Nakamura   Style.AlignConsecutiveTableGenBreakingDAGArgColons.Enabled = true;
444e54af608SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
445e54af608SHirofumi Nakamura                "  let dagarg = (ins\n"
446e54af608SHirofumi Nakamura                "      a  :$src1,\n"
447e54af608SHirofumi Nakamura                "      aa :$src2,\n"
448e54af608SHirofumi Nakamura                "      aaa:$src3\n"
449e54af608SHirofumi Nakamura                "  )\n"
450bf0b21aaSHirofumi Nakamura                "}",
451e54af608SHirofumi Nakamura                Style);
452e54af608SHirofumi Nakamura   verifyFormat("def Def : Parent {\n"
453e54af608SHirofumi Nakamura                "  let dagarg = (not a:$src1, aa:$src2, aaa:$src2)\n"
454bf0b21aaSHirofumi Nakamura                "}",
455e54af608SHirofumi Nakamura                Style);
456e54af608SHirofumi Nakamura }
457e54af608SHirofumi Nakamura 
458046682efSHirofumi Nakamura TEST_F(FormatTestTableGen, CondOperatorAlignment) {
459046682efSHirofumi Nakamura   FormatStyle Style = getGoogleStyle(FormatStyle::LK_TableGen);
460046682efSHirofumi Nakamura   Style.ColumnLimit = 60;
461046682efSHirofumi Nakamura   verifyFormat("let CondOpe1 = !cond(!eq(size, 1): 1,\n"
462046682efSHirofumi Nakamura                "                     !eq(size, 16): 1,\n"
463bf0b21aaSHirofumi Nakamura                "                     true: 0);",
464046682efSHirofumi Nakamura                Style);
465046682efSHirofumi Nakamura   Style.AlignConsecutiveTableGenCondOperatorColons.Enabled = true;
466046682efSHirofumi Nakamura   verifyFormat("let CondOpe1 = !cond(!eq(size, 1) : 1,\n"
467046682efSHirofumi Nakamura                "                     !eq(size, 16): 1,\n"
468bf0b21aaSHirofumi Nakamura                "                     true         : 0);",
469046682efSHirofumi Nakamura                Style);
470046682efSHirofumi Nakamura }
471046682efSHirofumi Nakamura 
47219cec9caSHirofumi Nakamura TEST_F(FormatTestTableGen, DefAlignment) {
47319cec9caSHirofumi Nakamura   FormatStyle Style = getGoogleStyle(FormatStyle::LK_TableGen);
47419cec9caSHirofumi Nakamura   Style.ColumnLimit = 60;
47519cec9caSHirofumi Nakamura   verifyFormat("def Def : Parent {}\n"
47619cec9caSHirofumi Nakamura                "def DefDef : Parent {}\n"
477bf0b21aaSHirofumi Nakamura                "def DefDefDef : Parent {}",
47819cec9caSHirofumi Nakamura                Style);
47919cec9caSHirofumi Nakamura   Style.AlignConsecutiveTableGenDefinitionColons.Enabled = true;
48019cec9caSHirofumi Nakamura   verifyFormat("def Def       : Parent {}\n"
48119cec9caSHirofumi Nakamura                "def DefDef    : Parent {}\n"
482bf0b21aaSHirofumi Nakamura                "def DefDefDef : Parent {}",
48319cec9caSHirofumi Nakamura                Style);
48419cec9caSHirofumi Nakamura }
48519cec9caSHirofumi Nakamura 
486054dc28aSJordan Rupprecht } // namespace format
487054dc28aSJordan Rupprecht } // end namespace clang
488