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