[TableGen] Resolve complex def names inside multiclasses
[oota-llvm.git] / test / TableGen / MultiClassDefName.td
1 // RUN: llvm-tblgen %s | FileCheck %s
2 // XFAIL: vg_leak
3
4 // CHECK: WorldHelloCC
5 // CHECK-NOT: WorldHelloCC
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">;
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
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
42 multiclass MC3<string s> {
43   def ZFizz#s : C<s>;
44 }
45
46 defm : MC3<"Buzz">;
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