llvm-project/llvm/test/TableGen/named-arguments.td
wangpc 91ccbc6c1c [TableGen] Support named arguments
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
2023-07-20 16:03:17 +08:00

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