
We provide a way to specify arguments in the form of `name=value` so that we don't have to specify all optional arguments before the one we'd like to change. Required arguments can alse be specified in this way. Note that the argument can only be specified once regardless of the way (named or positional) to specify and positional arguments should be put before named arguments. Reviewed By: reames Differential Revision: https://reviews.llvm.org/D152998
140 lines
4.2 KiB
TableGen
140 lines
4.2 KiB
TableGen
// RUN: llvm-tblgen %s | FileCheck %s
|
|
// RUN: not llvm-tblgen -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s
|
|
// RUN: not llvm-tblgen -DERROR2 %s 2>&1 | FileCheck --check-prefix=ERROR2 %s
|
|
// RUN: not llvm-tblgen -DERROR3 %s 2>&1 | FileCheck --check-prefix=ERROR3 %s
|
|
// RUN: not llvm-tblgen -DERROR4 %s 2>&1 | FileCheck --check-prefix=ERROR4 %s
|
|
// RUN: not llvm-tblgen -DERROR5 %s 2>&1 | FileCheck --check-prefix=ERROR5 %s
|
|
// RUN: not llvm-tblgen -DERROR6 %s 2>&1 | FileCheck --check-prefix=ERROR6 %s
|
|
// RUN: not llvm-tblgen -DERROR7 %s 2>&1 | FileCheck --check-prefix=ERROR7 %s
|
|
// RUN: not llvm-tblgen -DERROR8 %s 2>&1 | FileCheck --check-prefix=ERROR8 %s
|
|
|
|
class TestClass<int a, int b = 2, int c = 3> {
|
|
int value = !add(a, b, c);
|
|
}
|
|
// CHECK: def testClass1 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass2 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass3 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass4 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass5 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass6 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass7 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testClass8 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
def testClass1: TestClass<1>;
|
|
def testClass2: TestClass<1, 2>;
|
|
def testClass3: TestClass<1, 2, 3>;
|
|
def testClass4: TestClass<1, b=2>;
|
|
def testClass5: TestClass<1, c=3>;
|
|
def testClass6: TestClass<1, b=2, c=3>;
|
|
def testClass7: TestClass<1, c=3, b=2>;
|
|
def testClass8: TestClass<a=1, c=3, b=2>;
|
|
|
|
multiclass TestMultiClass<int a, int b = 2, int c = 3> {
|
|
def "": TestClass<a, b=b, c=c>;
|
|
}
|
|
|
|
// CHECK: def testMultiClass1 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass2 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass3 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass4 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass5 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass6 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass7 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
// CHECK: def testMultiClass8 {
|
|
// CHECK-NEXT: int value = 6;
|
|
// CHECK-NEXT: }
|
|
defm testMultiClass1: TestMultiClass<1>;
|
|
defm testMultiClass2: TestMultiClass<1, 2>;
|
|
defm testMultiClass3: TestMultiClass<1, 2, 3>;
|
|
defm testMultiClass4: TestMultiClass<1, b=2>;
|
|
defm testMultiClass5: TestMultiClass<1, c=3>;
|
|
defm testMultiClass6: TestMultiClass<1, b=2, c=3>;
|
|
defm testMultiClass7: TestMultiClass<1, c=3, b=2>;
|
|
defm testMultiClass8: TestMultiClass<a=1, b=2, c=3>;
|
|
|
|
class TestSubroutine<int a, int b=a>{
|
|
int value=!add(a, b);
|
|
}
|
|
|
|
// CHECK: def testSubroutine {
|
|
// CHECK-NEXT: int value1 = 2;
|
|
// CHECK-NEXT: int value2 = 2;
|
|
// CHECK-NEXT: int value3 = 2;
|
|
// CHECK-NEXT: }
|
|
def testSubroutine {
|
|
int value1=TestSubroutine<1>.value;
|
|
int value2=TestSubroutine<1, b=1>.value;
|
|
int value3=TestSubroutine<b=1, a=1>.value;
|
|
}
|
|
|
|
#ifdef ERROR1
|
|
// ERROR1: Argument "d" doesn't exist
|
|
def testError1: TestClass<1, d=3>;
|
|
#endif
|
|
|
|
#ifdef ERROR2
|
|
// ERROR2: The name of named argument should be a valid identifier
|
|
def testError2: TestClass<1, 3=0>;
|
|
#endif
|
|
|
|
#ifdef ERROR3
|
|
// ERROR3: Positional argument should be put before named argument
|
|
def testError3: TestClass<1, b=1, 2>;
|
|
#endif
|
|
|
|
#ifdef ERROR4
|
|
// ERROR4: The value of named argument should be initialized, but we got '?'
|
|
def testError4: TestClass<1, b=?>;
|
|
#endif
|
|
|
|
#ifdef ERROR5
|
|
// ERROR5: We can only specify the template argument 'TestClass:a' once
|
|
def testError5: TestClass<1, a=1>;
|
|
#endif
|
|
|
|
#ifdef ERROR6
|
|
// ERROR6: We can only specify the template argument 'TestMultiClass::a' once
|
|
defm testError6: TestMultiClass<1, a=1>;
|
|
#endif
|
|
|
|
#ifdef ERROR7
|
|
// ERROR7: We can only specify the template argument 'TestSubroutine:a' once
|
|
def testError7 {
|
|
int value=TestSubroutine<1, a=1>.value;
|
|
}
|
|
#endif
|
|
|
|
#ifdef ERROR8
|
|
// ERROR8: We can only specify the template argument 'TestClass:b' once
|
|
def testError8: TestClass<a=1, b=1, b=1>;
|
|
#endif
|