1// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
2
3// Test the assert statement at top level.
4
5// CHECK: assertion failed
6// CHECK-NOT: note: primary name is too short
7// CHECK: note: primary name is too long
8
9defvar Name = "Grace Brewster Murray Hopper";
10
11assert !ge(!size(Name), 20), "primary name is too short: " # Name;
12assert !le(!size(Name), 20), "primary name is too long: " # Name;
13
14// CHECK: assertion failed
15// CHECK: note: first name is incorrect
16
17def Rec01 {
18  string name = "Fred Smith";
19}
20
21assert !eq(!substr(Rec01.name, 0, 3), "Jane"),
22       !strconcat("first name is incorrect: ", Rec01.name);
23
24// CHECK: assertion failed
25// CHECK: note: record Rec02 is broken
26
27def Rec02 {
28  bit broken = true;
29}
30
31assert !not(Rec02.broken), "record Rec02 is broken";
32
33// CHECK: assertion failed
34// CHECK: note: cube of 9
35
36class Cube<int n> {
37  int result = !mul(n, n, n);
38}
39
40assert !eq(Cube<9>.result, 81), "cube of 9 should be 729";
41
42// Test the assert statement in a record definition.
43
44// CHECK: assertion failed
45// CHECK-NOT: primary first name is not "Grace"
46// CHECK: primary first name is not "Grack"
47// CHECK: assertion failed
48// CHECK: foo field should be
49
50def Rec10 {
51  assert !eq(!substr(Name, 0, 5), "Grace"), "primary first name is not \"Grace\"";
52  assert !eq(!substr(Name, 0, 5), "Grack"), "primary first name is not \"Grack\"";
53  string foo = "Foo";
54  assert !eq(foo, "foo"), "foo field should be \"Foo\"";
55}
56
57// CHECK: assertion failed
58// CHECK: note: magic field is incorrect: 42
59
60def Rec11 {
61  int magic = 13;
62  assert !eq(magic, 13), "magic field is incorrect: " # magic;
63  let magic = 42;
64}
65
66// CHECK: assertion failed
67// CHECK: note: var field has wrong value
68
69def Rec12 {
70  defvar prefix = "foo_";
71  string var = prefix # "snork";
72  assert !eq(var, "foo_snorx"), "var field has wrong value: " # var;
73}
74
75// CHECK: assertion failed
76// CHECK: note: kind field has wrong value
77
78class Kind {
79  int kind = 7;
80}
81
82def Rec13 : Kind {
83  let kind = 8;
84  assert !eq(kind, 7), "kind field has wrong value: " # kind;
85}
86
87// CHECK: assertion failed
88// CHECK: note: double_result should be
89
90def Rec14 : Cube<3> {
91  int double_result = !mul(result, 2);
92  assert !eq(double_result, 53), "double_result should be 54";
93}
94
95// Test the assert statement in a class definition.
96
97class PersonName<string name> {
98  assert !le(!size(name), 32), "person name is too long: " # name;
99  string Name = name;
100}
101
102class Person<string name, int age> : PersonName<name> {
103  assert !and(!ge(age, 1), !le(age, 120)),
104         "person age is invalid: " # age;
105  int Age = age;
106}
107
108def Rec20 : Person<"Donald Knuth", 60>;
109
110// CHECK: assertion failed
111// CHECK: note: person name is too long
112
113def Rec21 : Person<"Donald Uh Oh This Name Is Too Long Knuth", 50>;
114
115// CHECK: assertion failed
116// CHECK: note: person age is invalid
117
118def Rec22 : Person<"Donald Knuth", 150>;
119
120// Test the assert statement in an anonymous class invocation.
121
122def Rec30 {
123  string Name = Person<"Margaret Heafield Hamilton", 25>.Name;
124  int Age = Person<"Margaret Heafield Hamilton", 25>.Age;
125}
126
127def Rec31 {
128  string Name = Person<"Margaret Heafield And More Middle Names Hamilton", 25>.Name;
129  int Age = Person<"Margaret Heafield Hamilton", 25>.Age;
130}
131
132def Rec32 {
133  string Name = Person<"Margaret Heafield Hamilton", 25>.Name;
134  int Age = Person<"Margaret Heafield Hamilton", 0>.Age;
135}
136
137// Test the assert statement in a multiclass.
138
139