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