#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2    %switch test1 ( -1 : -1 )

  int TEST1_index;
  int TEST1_line;
  char *TEST1_file;
  static const void *TEST1[1] = {&&case_TEST1_M1};

  //     3    %switch test2 ( -1 : 0 )

  int TEST2_index;
  int TEST2_line;
  char *TEST2_file;
  static const void *TEST2[2] = {&&case_TEST2_default, &&case_TEST2_0};

  //     4    %switch test3 ( -1 : 1 )

  int TEST3_index;
  int TEST3_line;
  char *TEST3_file;
  static const void *TEST3[3] = {&&case_TEST3_missing, &&case_TEST3_missing, &&case_TEST3_1};

  //     5    %integer i = 0

  int I;
  I = 0;

  //     6
  //     7    ->test2(i)

  TEST2_line = __LINE__;
  TEST2_file = __FILE__;
  TEST2_index = I;
  goto case_TEST2_dispatch;

  //     8
  //     9    test2(0):

case_TEST2_0:;

//    10    test2(*):

case_TEST2_default:;

//    11    test3(1):

case_TEST3_1:;

//    12    test1(-1):

case_TEST1_M1:;

//    13
//    14  %endofprogram

  _imp_stop(0);
  return 0;

case_TEST1_dispatch:
  if (TEST1_index < -1 || TEST1_index > -1)
    _imp_signalf(6, 3, TEST1_index, "->TEST1(%d) out of bounds at %s line %d", TEST1_index, TEST1_file, TEST1_line);
  goto *TEST1[TEST1_index - -1];

case_TEST2_dispatch:
  if (TEST2_index < -1 || TEST2_index > 0)
    _imp_signalf(6, 3, TEST2_index, "->TEST2(%d) out of bounds at %s line %d", TEST2_index, TEST2_file, TEST2_line);
  goto *TEST2[TEST2_index - -1];

case_TEST3_dispatch:
  if (TEST3_index < -1 || TEST3_index > 1)
    _imp_signalf(6, 3, TEST3_index, "->TEST3(%d) out of bounds at %s line %d", TEST3_index, TEST3_file, TEST3_line);
  goto *TEST3[TEST3_index - -1];

case_TEST3_missing:
  _imp_signalf(8, 2, TEST3_index, "switch jump to undefined label TEST3(%d): at %s line %d", TEST3_index, TEST3_file,
               TEST3_line);
end_0:;
}