| // 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 | |