xref: /aosp_15_r20/external/llvm/test/TableGen/2010-03-24-PrematureDefaults.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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 Workerclass A<int k, bits<2> x = 1> {
5*9880d681SAndroid Build Coastguard Worker  int K = k;
6*9880d681SAndroid Build Coastguard Worker  bits<2> Bits = x;
7*9880d681SAndroid Build Coastguard Worker}
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker// CHECK: def a1
10*9880d681SAndroid Build Coastguard Worker// CHECK: Bits = { 0, 1 }
11*9880d681SAndroid Build Coastguard Workerdef a1 : A<12>;
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker// CHECK: def a2
14*9880d681SAndroid Build Coastguard Worker// CHECK: Bits = { 1, 0 }
15*9880d681SAndroid Build Coastguard Workerdef a2 : A<13, 2>;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker// Here was the bug: X.Bits would get resolved to the default a1.Bits while
18*9880d681SAndroid Build Coastguard Worker// resolving the first template argument. When the second template argument
19*9880d681SAndroid Build Coastguard Worker// was processed, X would be set correctly, but Bits retained the default
20*9880d681SAndroid Build Coastguard Worker// value.
21*9880d681SAndroid Build Coastguard Workerclass B<int k, A x = a1> {
22*9880d681SAndroid Build Coastguard Worker  A X = x;
23*9880d681SAndroid Build Coastguard Worker  bits<2> Bits = X.Bits;
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker// CHECK: def b1
27*9880d681SAndroid Build Coastguard Worker// CHECK: Bits = { 0, 1 }
28*9880d681SAndroid Build Coastguard Workerdef b1 : B<27>;
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker// CHECK: def b2
31*9880d681SAndroid Build Coastguard Worker// CHECK: Bits = { 1, 0 }
32*9880d681SAndroid Build Coastguard Workerdef b2 : B<28, a2>;
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerclass C<A x = a1> {
35*9880d681SAndroid Build Coastguard Worker  bits<2> Bits = x.Bits;
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker// CHECK: def c1
39*9880d681SAndroid Build Coastguard Worker// CHECK: Bits = { 0, 1 }
40*9880d681SAndroid Build Coastguard Workerdef c1 : C;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker// CHECK: def c2
43*9880d681SAndroid Build Coastguard Worker// CHECK: Bits = { 1, 0 }
44*9880d681SAndroid Build Coastguard Workerdef c2 : C<a2>;
45