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