1*9880d681SAndroid Build Coastguard Worker// RUN: llvm-tblgen %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker// XFAIL: vg_leak 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker// CHECK: WorldHelloCC 5*9880d681SAndroid Build Coastguard Worker// CHECK-NOT: WorldHelloCC 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerclass C<string n> { 8*9880d681SAndroid Build Coastguard Worker string name = n; 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workermulticlass Names<string n, string m> { 12*9880d681SAndroid Build Coastguard Worker def CC : C<n>; 13*9880d681SAndroid Build Coastguard Worker def World#NAME#CC : C<m>; 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefm Hello : Names<"hello", "world">; 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker// Ensure that the same anonymous name is used as the prefix for all defs in an 19*9880d681SAndroid Build Coastguard Worker// anonymous multiclass. 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerclass Outer<C i> { 22*9880d681SAndroid Build Coastguard Worker C Inner = i; 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workermulticlass MC<string name> { 26*9880d681SAndroid Build Coastguard Worker def hi : C<name>; 27*9880d681SAndroid Build Coastguard Worker def there : Outer<!cast<C>(!strconcat(NAME, "hi"))>; 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefm : MC<"foo">; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workermulticlass MC2<string name> { 33*9880d681SAndroid Build Coastguard Worker def there : Outer<C<name> >; 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker// Ensure that we've correctly captured the reference to name from the implicit 37*9880d681SAndroid Build Coastguard Worker// anonymous C def in the template parameter list of Outer. 38*9880d681SAndroid Build Coastguard Worker// CHECK-NOT: MC2::name 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefm : MC2<"bar">; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workermulticlass MC3<string s> { 43*9880d681SAndroid Build Coastguard Worker def ZFizz#s : C<s>; 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefm : MC3<"Buzz">; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker// CHECK: def ZFizzBuzz 49*9880d681SAndroid Build Coastguard Worker// CHECK: string name = "Buzz"; 50*9880d681SAndroid Build Coastguard Worker// CHECK-NOT: MC3::s 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workermulticlass MC4<string s> { 53*9880d681SAndroid Build Coastguard Worker def NAME#s : C<s>; 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefm ZTagazok : MC4<"AToi">; 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker// CHECK: def ZTagazokAToi 59*9880d681SAndroid Build Coastguard Worker// CHECK: string name = "AToi"; 60*9880d681SAndroid Build Coastguard Worker// CHECK-NOT: MC4::s 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workermulticlass MC5<C c> { 63*9880d681SAndroid Build Coastguard Worker def NAME#c.name : C<c.name>; 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdef CTiger : C<"Tiger">; 67*9880d681SAndroid Build Coastguard Workerdefm Zebra : MC5<CTiger>; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker// CHECK: def ZebraTiger 70*9880d681SAndroid Build Coastguard Worker// CHECK: string name = "Tiger"; 71*9880d681SAndroid Build Coastguard Worker// CHECK-NOT: MC5::c 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workermulticlass MC6<C c> { 74*9880d681SAndroid Build Coastguard Worker def NAME#Tiger#c.name : C<c.name>; 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdef CAligator : C<"Aligator">; 78*9880d681SAndroid Build Coastguard Workerdefm Zebra : MC6<CAligator>; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker// CHECK: def ZebraTigerAligator 81*9880d681SAndroid Build Coastguard Worker// CHECK: string name = "Aligator"; 82*9880d681SAndroid Build Coastguard Worker// CHECK-NOT: MC6::c 83*9880d681SAndroid Build Coastguard Worker 84