xref: /llvm-project/llvm/test/TableGen/named-arguments.td (revision 91ccbc6c1c4c121935ee4fbfa0db13ad86590a59)
1// RUN: llvm-tblgen %s | FileCheck %s
2// RUN: not llvm-tblgen -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s
3// RUN: not llvm-tblgen -DERROR2 %s 2>&1 | FileCheck --check-prefix=ERROR2 %s
4// RUN: not llvm-tblgen -DERROR3 %s 2>&1 | FileCheck --check-prefix=ERROR3 %s
5// RUN: not llvm-tblgen -DERROR4 %s 2>&1 | FileCheck --check-prefix=ERROR4 %s
6// RUN: not llvm-tblgen -DERROR5 %s 2>&1 | FileCheck --check-prefix=ERROR5 %s
7// RUN: not llvm-tblgen -DERROR6 %s 2>&1 | FileCheck --check-prefix=ERROR6 %s
8// RUN: not llvm-tblgen -DERROR7 %s 2>&1 | FileCheck --check-prefix=ERROR7 %s
9// RUN: not llvm-tblgen -DERROR8 %s 2>&1 | FileCheck --check-prefix=ERROR8 %s
10
11class TestClass<int a, int b = 2, int c = 3> {
12  int value =  !add(a, b, c);
13}
14// CHECK:      def testClass1 {
15// CHECK-NEXT:   int value = 6;
16// CHECK-NEXT: }
17// CHECK:      def testClass2 {
18// CHECK-NEXT:   int value = 6;
19// CHECK-NEXT: }
20// CHECK:      def testClass3 {
21// CHECK-NEXT:   int value = 6;
22// CHECK-NEXT: }
23// CHECK:      def testClass4 {
24// CHECK-NEXT:   int value = 6;
25// CHECK-NEXT: }
26// CHECK:      def testClass5 {
27// CHECK-NEXT:   int value = 6;
28// CHECK-NEXT: }
29// CHECK:      def testClass6 {
30// CHECK-NEXT:   int value = 6;
31// CHECK-NEXT: }
32// CHECK:      def testClass7 {
33// CHECK-NEXT:   int value = 6;
34// CHECK-NEXT: }
35// CHECK:      def testClass8 {
36// CHECK-NEXT:   int value = 6;
37// CHECK-NEXT: }
38def testClass1: TestClass<1>;
39def testClass2: TestClass<1, 2>;
40def testClass3: TestClass<1, 2, 3>;
41def testClass4: TestClass<1, b=2>;
42def testClass5: TestClass<1, c=3>;
43def testClass6: TestClass<1, b=2, c=3>;
44def testClass7: TestClass<1, c=3, b=2>;
45def testClass8: TestClass<a=1, c=3, b=2>;
46
47multiclass TestMultiClass<int a, int b = 2, int c = 3> {
48  def "": TestClass<a, b=b, c=c>;
49}
50
51// CHECK:      def testMultiClass1 {
52// CHECK-NEXT:   int value = 6;
53// CHECK-NEXT: }
54// CHECK:      def testMultiClass2 {
55// CHECK-NEXT:   int value = 6;
56// CHECK-NEXT: }
57// CHECK:      def testMultiClass3 {
58// CHECK-NEXT:   int value = 6;
59// CHECK-NEXT: }
60// CHECK:      def testMultiClass4 {
61// CHECK-NEXT:   int value = 6;
62// CHECK-NEXT: }
63// CHECK:      def testMultiClass5 {
64// CHECK-NEXT:   int value = 6;
65// CHECK-NEXT: }
66// CHECK:      def testMultiClass6 {
67// CHECK-NEXT:   int value = 6;
68// CHECK-NEXT: }
69// CHECK:      def testMultiClass7 {
70// CHECK-NEXT:   int value = 6;
71// CHECK-NEXT: }
72// CHECK:      def testMultiClass8 {
73// CHECK-NEXT:   int value = 6;
74// CHECK-NEXT: }
75defm testMultiClass1: TestMultiClass<1>;
76defm testMultiClass2: TestMultiClass<1, 2>;
77defm testMultiClass3: TestMultiClass<1, 2, 3>;
78defm testMultiClass4: TestMultiClass<1, b=2>;
79defm testMultiClass5: TestMultiClass<1, c=3>;
80defm testMultiClass6: TestMultiClass<1, b=2, c=3>;
81defm testMultiClass7: TestMultiClass<1, c=3, b=2>;
82defm testMultiClass8: TestMultiClass<a=1, b=2, c=3>;
83
84class TestSubroutine<int a, int b=a>{
85  int value=!add(a, b);
86}
87
88// CHECK:      def testSubroutine {
89// CHECK-NEXT:   int value1 = 2;
90// CHECK-NEXT:   int value2 = 2;
91// CHECK-NEXT:   int value3 = 2;
92// CHECK-NEXT: }
93def testSubroutine {
94  int value1=TestSubroutine<1>.value;
95  int value2=TestSubroutine<1, b=1>.value;
96  int value3=TestSubroutine<b=1, a=1>.value;
97}
98
99#ifdef ERROR1
100// ERROR1: Argument "d" doesn't exist
101def testError1: TestClass<1, d=3>;
102#endif
103
104#ifdef ERROR2
105// ERROR2: The name of named argument should be a valid identifier
106def testError2: TestClass<1, 3=0>;
107#endif
108
109#ifdef ERROR3
110// ERROR3: Positional argument should be put before named argument
111def testError3: TestClass<1, b=1, 2>;
112#endif
113
114#ifdef ERROR4
115// ERROR4: The value of named argument should be initialized, but we got '?'
116def testError4: TestClass<1, b=?>;
117#endif
118
119#ifdef ERROR5
120// ERROR5: We can only specify the template argument 'TestClass:a' once
121def testError5: TestClass<1, a=1>;
122#endif
123
124#ifdef ERROR6
125// ERROR6: We can only specify the template argument 'TestMultiClass::a' once
126defm testError6: TestMultiClass<1, a=1>;
127#endif
128
129#ifdef ERROR7
130// ERROR7: We can only specify the template argument 'TestSubroutine:a' once
131def testError7 {
132  int value=TestSubroutine<1, a=1>.value;
133}
134#endif
135
136#ifdef ERROR8
137// ERROR8: We can only specify the template argument 'TestClass:b' once
138def testError8: TestClass<a=1, b=1, b=1>;
139#endif
140