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 Rec1 {
18  string name = "Fred Smith";
19}
20
21assert !eq(!substr(Rec1.name, 0, 3), "Jane"),
22       !strconcat("first name is incorrect: ", Rec1.name);
23
24// CHECK: assertion failed
25// CHECK: note: record Rec2 is broken
26
27def Rec2 {
28  bit broken = true;
29}
30
31assert !not(Rec2.broken), "record Rec2 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
97// Test the assert statement in a multiclass.
98
99