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