llvm/test/TableGen/MultiClassDefName.td
Hal Finkel 80bb2d981d [TableGen] Resolve complex def names inside multiclasses
We had not been trying hard enough to resolve def names inside multiclasses
that had complex concatenations, etc. Now we'll try harder.

Patch by Amaury Sechet!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237877 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-21 04:32:56 +00:00

84 lines
1.5 KiB
TableGen

// RUN: llvm-tblgen %s | FileCheck %s
// XFAIL: vg_leak
// CHECK: WorldHelloCC
// CHECK-NOT: WorldHelloCC
class C<string n> {
string name = n;
}
multiclass Names<string n, string m> {
def CC : C<n>;
def World#NAME#CC : C<m>;
}
defm Hello : Names<"hello", "world">;
// Ensure that the same anonymous name is used as the prefix for all defs in an
// anonymous multiclass.
class Outer<C i> {
C Inner = i;
}
multiclass MC<string name> {
def hi : C<name>;
def there : Outer<!cast<C>(!strconcat(NAME, "hi"))>;
}
defm : MC<"foo">;
multiclass MC2<string name> {
def there : Outer<C<name> >;
}
// Ensure that we've correctly captured the reference to name from the implicit
// anonymous C def in the template parameter list of Outer.
// CHECK-NOT: MC2::name
defm : MC2<"bar">;
multiclass MC3<string s> {
def ZFizz#s : C<s>;
}
defm : MC3<"Buzz">;
// CHECK: def ZFizzBuzz
// CHECK: string name = "Buzz";
// CHECK-NOT: MC3::s
multiclass MC4<string s> {
def NAME#s : C<s>;
}
defm ZTagazok : MC4<"AToi">;
// CHECK: def ZTagazokAToi
// CHECK: string name = "AToi";
// CHECK-NOT: MC4::s
multiclass MC5<C c> {
def NAME#c.name : C<c.name>;
}
def CTiger : C<"Tiger">;
defm Zebra : MC5<CTiger>;
// CHECK: def ZebraTiger
// CHECK: string name = "Tiger";
// CHECK-NOT: MC5::c
multiclass MC6<C c> {
def NAME#Tiger#c.name : C<c.name>;
}
def CAligator : C<"Aligator">;
defm Zebra : MC6<CAligator>;
// CHECK: def ZebraTigerAligator
// CHECK: string name = "Aligator";
// CHECK-NOT: MC6::c