Bill Wendling | b4be7f6 | 2013-08-22 20:46:05 +0000 | [diff] [blame] | 1 | // RUN: llvm-tblgen %s | FileCheck %s |
NAKAMURA Takumi | a22657f | 2013-11-10 14:26:08 +0000 | [diff] [blame] | 2 | // XFAIL: vg_leak |
Bill Wendling | b4be7f6 | 2013-08-22 20:46:05 +0000 | [diff] [blame] | 3 | |
| 4 | // CHECK: WorldHelloCC |
| 5 | // CHECK-NOT: WorldHelloCC |
David Greene | 065f259 | 2009-05-05 16:28:25 +0000 | [diff] [blame] | 6 | |
| 7 | class C<string n> { |
| 8 | string name = n; |
| 9 | } |
| 10 | |
| 11 | multiclass Names<string n, string m> { |
| 12 | def CC : C<n>; |
| 13 | def World#NAME#CC : C<m>; |
| 14 | } |
| 15 | |
| 16 | defm Hello : Names<"hello", "world">; |
Hal Finkel | 2370e55 | 2014-01-02 19:35:33 +0000 | [diff] [blame] | 17 | |
| 18 | // Ensure that the same anonymous name is used as the prefix for all defs in an |
| 19 | // anonymous multiclass. |
| 20 | |
| 21 | class Outer<C i> { |
| 22 | C Inner = i; |
| 23 | } |
| 24 | |
| 25 | multiclass MC<string name> { |
| 26 | def hi : C<name>; |
| 27 | def there : Outer<!cast<C>(!strconcat(NAME, "hi"))>; |
| 28 | } |
| 29 | |
| 30 | defm : MC<"foo">; |
| 31 | |
Hal Finkel | 0a3368c | 2014-01-02 20:47:09 +0000 | [diff] [blame] | 32 | multiclass MC2<string name> { |
| 33 | def there : Outer<C<name> >; |
| 34 | } |
| 35 | |
| 36 | // Ensure that we've correctly captured the reference to name from the implicit |
| 37 | // anonymous C def in the template parameter list of Outer. |
| 38 | // CHECK-NOT: MC2::name |
| 39 | |
| 40 | defm : MC2<"bar">; |
| 41 | |
Hal Finkel | 80bb2d9 | 2015-05-21 04:32:56 +0000 | [diff] [blame] | 42 | multiclass MC3<string s> { |
| 43 | def ZFizz#s : C<s>; |
| 44 | } |
| 45 | |
Nicolai Haehnle | 26db53e | 2018-06-04 14:26:05 +0000 | [diff] [blame] | 46 | defm "" : MC3<"Buzz">; |
Hal Finkel | 80bb2d9 | 2015-05-21 04:32:56 +0000 | [diff] [blame] | 47 | |
| 48 | // CHECK: def ZFizzBuzz |
| 49 | // CHECK: string name = "Buzz"; |
| 50 | // CHECK-NOT: MC3::s |
| 51 | |
| 52 | multiclass MC4<string s> { |
| 53 | def NAME#s : C<s>; |
| 54 | } |
| 55 | |
| 56 | defm ZTagazok : MC4<"AToi">; |
| 57 | |
| 58 | // CHECK: def ZTagazokAToi |
| 59 | // CHECK: string name = "AToi"; |
| 60 | // CHECK-NOT: MC4::s |
| 61 | |
| 62 | multiclass MC5<C c> { |
| 63 | def NAME#c.name : C<c.name>; |
| 64 | } |
| 65 | |
| 66 | def CTiger : C<"Tiger">; |
| 67 | defm Zebra : MC5<CTiger>; |
| 68 | |
| 69 | // CHECK: def ZebraTiger |
| 70 | // CHECK: string name = "Tiger"; |
| 71 | // CHECK-NOT: MC5::c |
| 72 | |
| 73 | multiclass MC6<C c> { |
| 74 | def NAME#Tiger#c.name : C<c.name>; |
| 75 | } |
| 76 | |
| 77 | def CAligator : C<"Aligator">; |
| 78 | defm Zebra : MC6<CAligator>; |
| 79 | |
| 80 | // CHECK: def ZebraTigerAligator |
| 81 | // CHECK: string name = "Aligator"; |
| 82 | // CHECK-NOT: MC6::c |
| 83 | |