brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · c6c230d Raw
188 lines · plain
1// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s -DFILE=%s2 3// -----------------------------------------------------------------------------4// Test the assert statement at top level.5// -----------------------------------------------------------------------------6 7// CHECK: [[FILE]]:[[@LINE+4]]:8: error: assertion failed: primary name is too long8// CHECK-NOT: note: primary name is too short9defvar Name = "Grace Brewster Murray Hopper";10assert !ge(!size(Name), 20), "primary name is too short: " # Name;11assert !le(!size(Name), 20), "primary name is too long: " # Name;12 13// CHECK: assertion failed: first name is incorrect14def Rec01 {15  string name = "Fred Smith";16}17 18assert !eq(!substr(Rec01.name, 0, 3), "Jane"),19       !strconcat("first name is incorrect: ", Rec01.name);20 21// CHECK: assertion failed: record Rec02 is broken22def Rec02 {23  bit broken = true;24}25assert !not(Rec02.broken), "record Rec02 is broken";26 27// CHECK: assertion failed: cube of 9 should be 72928class Cube<int n> {29  int result = !mul(n, n, n);30}31assert !eq(Cube<9>.result, 81), "cube of 9 should be 729";32 33// Verify that the assert fails only once.34// CHECK: assertion failed: foreach i cannot be 235// CHECK-NOT: assertion failed: foreach i cannot be 236foreach i = 1...3 in {37  assert !ne(i, 2), "foreach i cannot be 2";38  def bar_ # i;39}40 41// -----------------------------------------------------------------------------42// Test the assert statement in a record definition.43// -----------------------------------------------------------------------------44 45// CHECK: [[FILE]]:[[@LINE+6]]:10: error: assertion failed: primary first name is not "Grack"46// CHECK-NOT: primary first name is not "Grace"47// CHECK: [[FILE]]:[[@LINE+6]]:10: error: assertion failed: foo field should be48// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record49def Rec10 {50  assert !eq(!substr(Name, 0, 5), "Grace"), "primary first name is not \"Grace\"";51  assert !eq(!substr(Name, 0, 5), "Grack"), "primary first name is not \"Grack\"";52  string foo = "Foo";53  assert !eq(foo, "foo"), "foo field should be \"Foo\"";54}55 56// CHECK: [[FILE]]:[[@LINE+4]]:10: error: assertion failed: magic field is incorrect: 4257// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record58def Rec11 {59  int magic = 13;60  assert !eq(magic, 13), "magic field is incorrect: " # magic;61  let magic = 42;       62}63 64// CHECK: [[FILE]]:[[@LINE+5]]:10: error: assertion failed: var field has wrong value65// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record66def Rec12 {67  defvar prefix = "foo_";68  string var = prefix # "snork";69  assert !eq(var, "foo_snorx"), "var field has wrong value: " # var;70}71 72// CHECK: assertion failed: kind field has wrong value73class Kind {74  int kind = 7;75}76 77// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record78def Rec13 : Kind {79  let kind = 8;80  assert !eq(kind, 7), "kind field has wrong value: " # kind;81}82 83// CHECK: assertion failed: double_result should be84// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record85def Rec14 : Cube<3> {86  int double_result = !mul(result, 2);87  assert !eq(double_result, 53), "double_result should be 54";88}89 90// -----------------------------------------------------------------------------91// Test the assert statement in a class definition.92// -----------------------------------------------------------------------------93 94class PersonName<string name> {95  assert !le(!size(name), 32), "person name is too long: " # name;96  string Name = name;97}98 99class Person<string name, int age> : PersonName<name> {100  assert !and(!ge(age, 1), !le(age, 120)),101         "person age is invalid: " # age;102  int Age = age;103}104 105def Rec20 : Person<"Donald Knuth", 60>;106 107// CHECK: assertion failed: person name is too long108// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record109def Rec21 : Person<"Donald Uh Oh This Name Is Too Long Knuth", 50>;110 111// CHECK: assertion failed: person age is invalid112// CHECK: [[FILE]]:[[@LINE+1]]:5: error: assertion failed in this record113def Rec22 : Person<"Donald Knuth", 150>;114 115// Test the assert statement in an anonymous class invocation.116def Rec30 {117  string Name = Person<"Margaret Heafield Hamilton", 25>.Name;118  int Age = Person<"Margaret Heafield Hamilton", 25>.Age;119}120 121// CHECK: assertion failed: person name is too long122// CHECK: [[FILE]]:[[@LINE+2]]:17: error: assertion failed in this record123def Rec31 {124  string Name = Person<"Margaret Heafield And More Middle Names Hamilton", 25>.Name;125  int Age = Person<"Margaret Heafield Hamilton", 25>.Age;126}127 128// CHECK: assertion failed: person age is invalid: 0129// CHECK: [[FILE]]:[[@LINE+3]]:13: error: assertion failed in this record130def Rec32 {131  string Name = Person<"Margaret Heafield Hamilton", 25>.Name;132  int Age = Person<"Margaret Heafield Hamilton", 0>.Age;133}134 135// -----------------------------------------------------------------------------136// Test the assert statement in a multiclass.137// -----------------------------------------------------------------------------138 139// CHECK: assertion failed: MC1 id string is too long140// CHECK: assertion failed: MC1 seq is too high141multiclass MC1<string id, int seq> {142  assert !le(!size(id), 5), "MC1 id string is too long";143  assert !le(seq, 999999), "MC1 seq is too high";144 145  def _mc1 {146    string ID = id;147    int Seq = seq;148  }149}150 151defm Rec40 : MC1<"ILISP", 999>;152defm Rec41 : MC1<"ILISPX", 999>;153defm Rec42 : MC1<"ILISP", 999999999>;154 155// CHECK: assertion failed: MC2 phrase must be secret: secrex code156multiclass MC2<string phr> {157  assert !eq(!substr(phr, 0, 6), "secret"), "MC2 phrase must be secret: " # phr;158 159  def _mc2 {160    string phrase = phr;161  }162}163 164multiclass MC3<string phr> {165  defm _mc3 : MC2<phr>;166}167 168defm Rec43 : MC3<"secrex code">;169 170// CHECK: assertion failed: MC2 phrase must be secret: xecret code171multiclass MC4<string phr> : MC2<phr> {172  def _def;173}174 175defm Rec44 : MC4<"xecret code">;176 177// Test a defm in a multiclass that inherits from a class with asserts.178 179// CHECK: assertion failed: MC5 name must include a space: Ada_Lovelace180// CHECK: assertion failed: person age is invalid: 666181multiclass MC5<string phr, string name, int age> {182  assert !ne(!find(name, " "), -1), "MC5 name must include a space: " # name;183 184  defm _mc5 : MC2<phr>, Person<name, age>;185}186 187defm Rec45 : MC5<"secret password", "Ada_Lovelace", 666>;188