modernc.org/cc@v1.0.1/v2/testdata/tcc-0.9.26/tests/tcctest.c (about)

     1  /*
     2   * TCC auto test program
     3   */
     4  #include "../config.h"
     5  
     6  #if GCC_MAJOR >= 3
     7  
     8  /* Unfortunately, gcc version < 3 does not handle that! */
     9  #define ALL_ISOC99
    10  
    11  /* only gcc 3 handles _Bool correctly */
    12  #define BOOL_ISOC99
    13  
    14  /* gcc 2.95.3 does not handle correctly CR in strings or after strays */
    15  #define CORRECT_CR_HANDLING
    16  
    17  #endif
    18  
    19  /* deprecated and no longer supported in gcc 3.3 */
    20  //#define ACCEPT_CR_IN_STRINGS
    21  
    22  /* __VA_ARGS__ and __func__ support */
    23  #define C99_MACROS
    24  
    25  /* test various include syntaxes */
    26  
    27  #define TCCLIB_INC <tcclib.h>
    28  #define TCCLIB_INC1 <tcclib
    29  #define TCCLIB_INC2 h>
    30  #define TCCLIB_INC3 "tcclib"
    31  
    32  #include TCCLIB_INC
    33  
    34  #include TCCLIB_INC1.TCCLIB_INC2
    35  
    36  #include TCCLIB_INC1.h>
    37  
    38  /* gcc 3.2 does not accept that (bug ?) */
    39  //#include TCCLIB_INC3 ".h"
    40  
    41  #include <tcclib.h>
    42  
    43  #include "tcclib.h"
    44  
    45  void string_test();
    46  void expr_test();
    47  void macro_test();
    48  void recursive_macro_test();
    49  void scope_test();
    50  void forward_test();
    51  void funcptr_test();
    52  void loop_test();
    53  void switch_test();
    54  void goto_test();
    55  void enum_test();
    56  void typedef_test();
    57  void struct_test();
    58  void array_test();
    59  void expr_ptr_test();
    60  void bool_test();
    61  void expr2_test();
    62  void constant_expr_test();
    63  void expr_cmp_test();
    64  void char_short_test();
    65  void init_test(void);
    66  void compound_literal_test(void);
    67  int kr_test();
    68  void struct_assign_test(void);
    69  void cast_test(void);
    70  void bitfield_test(void);
    71  void c99_bool_test(void);
    72  void float_test(void);
    73  void longlong_test(void);
    74  void manyarg_test(void);
    75  void stdarg_test(void);
    76  void whitespace_test(void);
    77  void relocation_test(void);
    78  void old_style_function(void);
    79  void alloca_test(void);
    80  void c99_vla_test(int size1, int size2);
    81  void sizeof_test(void);
    82  void typeof_test(void);
    83  void local_label_test(void);
    84  void statement_expr_test(void);
    85  void asm_test(void);
    86  void builtin_test(void);
    87  void weak_test(void);
    88  void global_data_test(void);
    89  void cmp_comparison_test(void);
    90  void math_cmp_test(void);
    91  void callsave_test(void);
    92  void builtin_frame_address_test(void);
    93  
    94  int fib(int n);
    95  void num(int n);
    96  void forward_ref(void);
    97  int isid(int c);
    98  
    99  #define A 2
   100  #define N 1234 + A
   101  #define pf printf
   102  #define M1(a, b)  (a) + (b)
   103  
   104  #define str\
   105  (s) # s
   106  #define glue(a, b) a ## b
   107  #define xglue(a, b) glue(a, b)
   108  #define HIGHLOW "hello"
   109  #define LOW LOW ", world"
   110  
   111  static int onetwothree = 123;
   112  #define onetwothree4 onetwothree
   113  #define onetwothree xglue(onetwothree,4)
   114  
   115  #define min(a, b) ((a) < (b) ? (a) : (b))
   116  
   117  #ifdef C99_MACROS
   118  #define dprintf(level,...) printf(__VA_ARGS__)
   119  #endif
   120  
   121  /* gcc vararg macros */
   122  #define dprintf1(level, fmt, args...) printf(fmt, ## args)
   123  
   124  #define MACRO_NOARGS()
   125  
   126  #define AAA 3
   127  #undef AAA
   128  #define AAA 4
   129  
   130  #if 1
   131  #define B3 1
   132  #elif 1
   133  #define B3 2
   134  #elif 0
   135  #define B3 3
   136  #else
   137  #define B3 4
   138  #endif
   139  
   140  #define __INT64_C(c)	c ## LL
   141  #define INT64_MIN	(-__INT64_C(9223372036854775807)-1)
   142  
   143  int qq(int x)
   144  {
   145      return x + 40;
   146  }
   147  #define qq(x) x
   148  
   149  #define spin_lock(lock) do { } while (0)
   150  #define wq_spin_lock spin_lock
   151  #define TEST2() wq_spin_lock(a)
   152  
   153  void macro_test(void)
   154  {
   155      printf("macro:\n");
   156      pf("N=%d\n", N);
   157      printf("aaa=%d\n", AAA);
   158  
   159      printf("min=%d\n", min(1, min(2, -1)));
   160  
   161      printf("s1=%s\n", glue(HIGH, LOW));
   162      printf("s2=%s\n", xglue(HIGH, LOW));
   163      printf("s3=%s\n", str("c"));
   164      printf("s4=%s\n", str(a1));
   165      printf("B3=%d\n", B3);
   166  
   167      printf("onetwothree=%d\n", onetwothree);
   168  
   169  #ifdef A
   170      printf("A defined\n");
   171  #endif
   172  #ifdef B
   173      printf("B defined\n");
   174  #endif
   175  #ifdef A
   176      printf("A defined\n");
   177  #else
   178      printf("A not defined\n");
   179  #endif
   180  #ifdef B
   181      printf("B defined\n");
   182  #else
   183      printf("B not defined\n");
   184  #endif
   185  
   186  #ifdef A
   187      printf("A defined\n");
   188  #ifdef B
   189      printf("B1 defined\n");
   190  #else
   191      printf("B1 not defined\n");
   192  #endif
   193  #else
   194      printf("A not defined\n");
   195  #ifdef B
   196      printf("B2 defined\n");
   197  #else
   198      printf("B2 not defined\n");
   199  #endif
   200  #endif
   201  
   202  #if 1+1
   203      printf("test true1\n");
   204  #endif
   205  #if 0
   206      printf("test true2\n");
   207  #endif
   208  #if 1-1
   209      printf("test true3\n");
   210  #endif
   211  #if defined(A)
   212      printf("test trueA\n");
   213  #endif
   214  #if defined(B)
   215      printf("test trueB\n");
   216  #endif
   217  
   218  #if 0
   219      printf("test 0\n");
   220  #elif 0
   221      printf("test 1\n");
   222  #elif 2
   223      printf("test 2\n");
   224  #else
   225      printf("test 3\n");
   226  #endif
   227  
   228      MACRO_NOARGS();
   229  
   230  #ifdef __LINE__
   231      printf("__LINE__ defined\n");
   232  #endif
   233  
   234      printf("__LINE__=%d __FILE__=%s\n",
   235             __LINE__, __FILE__);
   236  #line 200
   237      printf("__LINE__=%d __FILE__=%s\n",
   238             __LINE__, __FILE__);
   239  #line 203 "test" 
   240      printf("__LINE__=%d __FILE__=%s\n",
   241             __LINE__, __FILE__);
   242  #line 227 "tcctest.c"
   243  
   244      /* not strictly preprocessor, but we test it there */
   245  #ifdef C99_MACROS
   246      printf("__func__ = %s\n", __func__);
   247      dprintf(1, "vaarg=%d\n", 1);
   248  #endif
   249      dprintf1(1, "vaarg1\n");
   250      dprintf1(1, "vaarg1=%d\n", 2);
   251      dprintf1(1, "vaarg1=%d %d\n", 1, 2);
   252  
   253      /* gcc extension */
   254      printf("func='%s'\n", __FUNCTION__);
   255  
   256      /* complicated macros in glibc */
   257      printf("INT64_MIN=%Ld\n", INT64_MIN);
   258      {
   259          int a;
   260          a = 1;
   261          glue(a+, +);
   262          printf("a=%d\n", a);
   263          glue(a <, <= 2);
   264          printf("a=%d\n", a);
   265      }
   266      
   267      /* macro function with argument outside the macro string */
   268  #define MF_s MF_hello
   269  #define MF_hello(msg) printf("%s\n",msg)
   270  
   271  #define MF_t printf("tralala\n"); MF_hello
   272  
   273      MF_s("hi");
   274      MF_t("hi");
   275      
   276      /* test macro substituion inside args (should not eat stream) */
   277      printf("qq=%d\n", qq(qq)(2));
   278  
   279      /* test zero argument case. NOTE: gcc 2.95.x does not accept a
   280         null argument without a space. gcc 3.2 fixes that. */
   281  
   282  #define qq1(x) 1
   283      printf("qq1=%d\n", qq1( ));
   284  
   285      /* comment with stray handling *\
   286  /
   287         /* this is a valid *\/ comment */
   288         /* this is a valid comment *\*/
   289      //  this is a valid\
   290  comment
   291  
   292      /* test function macro substitution when the function name is
   293         substituted */
   294      TEST2();
   295  
   296      /* And again when the name and parenthes are separated by a
   297         comment.  */
   298      TEST2 /* the comment */ ();
   299  }
   300  
   301  
   302  static void print_num(char *fn, int line, int num) {
   303      printf("fn %s, line %d, num %d\n", fn, line, num);
   304  }
   305  
   306  void recursive_macro_test(void)
   307  {
   308  
   309  #define ELF32_ST_TYPE(val)              ((val) & 0xf)
   310  #define ELF32_ST_INFO(bind, type)       (((bind) << 4) + ((type) & 0xf))
   311  #define STB_WEAK        2               /* Weak symbol */
   312  #define ELFW(type) ELF##32##_##type
   313      printf("%d\n", ELFW(ST_INFO)(STB_WEAK, ELFW(ST_TYPE)(123)));
   314  
   315  #define WRAP(x) x
   316      
   317  #define print_num(x) print_num(__FILE__,__LINE__,x)
   318      print_num(123);
   319      WRAP(print_num(123));
   320      WRAP(WRAP(print_num(123)));
   321  
   322  static struct recursive_macro { int rm_field; } G;
   323  #define rm_field (G.rm_field)
   324      printf("rm_field = %d\n", rm_field);
   325      printf("rm_field = %d\n", WRAP(rm_field));
   326      WRAP((printf("rm_field = %d %d\n", rm_field, WRAP(rm_field))));
   327  }
   328  
   329  int op(a,b)
   330  {
   331      return a / b;
   332  }
   333  
   334  int ret(a)
   335  {
   336      if (a == 2)
   337          return 1;
   338      if (a == 3)
   339          return 2;
   340      return 0;
   341  }
   342  
   343  void ps(const char *s)
   344  {
   345      int c;
   346      while (1) {
   347          c = *s;
   348          if (c == 0)
   349              break;
   350          printf("%c", c);
   351          s++;
   352      }
   353  }
   354  
   355  const char foo1_string[] = "\
   356  bar\n\
   357  test\14\
   358  1";
   359  
   360  void string_test()
   361  {
   362      unsigned int b;
   363      printf("string:\n");
   364      printf("\141\1423\143\n");/* dezdez test */
   365      printf("\x41\x42\x43\x3a\n");
   366      printf("c=%c\n", 'r');
   367      printf("wc=%C 0x%lx %C\n", L'a', L'\x1234', L'c');
   368      printf("foo1_string='%s'\n", foo1_string);
   369  #if 0
   370      printf("wstring=%S\n", L"abc");
   371      printf("wstring=%S\n", L"abc" L"def" "ghi");
   372      printf("'\\377'=%d '\\xff'=%d\n", '\377', '\xff');
   373      printf("L'\\377'=%d L'\\xff'=%d\n", L'\377', L'\xff');
   374  #endif
   375      ps("test\n");
   376      b = 32;
   377      while ((b = b + 1) < 96) {
   378          printf("%c", b);
   379      }
   380      printf("\n");
   381      printf("fib=%d\n", fib(33));
   382      b = 262144;
   383      while (b != 0x80000000) {
   384          num(b);
   385          b = b * 2;
   386      }
   387  }
   388  
   389  void loop_test()
   390  {
   391      int i;
   392      i = 0;
   393      while (i < 10)
   394          printf("%d", i++);
   395      printf("\n");
   396      for(i = 0; i < 10;i++)
   397          printf("%d", i);
   398      printf("\n");
   399      i = 0;
   400      do {
   401          printf("%d", i++);
   402      } while (i < 10);
   403      printf("\n");
   404  
   405      char count = 123;
   406      /* c99 for loop init test */
   407      for (size_t count = 1; count < 3; count++)
   408          printf("count=%d\n", count);
   409      printf("count = %d\n", count);
   410  
   411      /* break/continue tests */
   412      i = 0;
   413      while (1) {
   414          if (i == 6)
   415              break;
   416          i++;
   417          if (i == 3)
   418              continue;
   419          printf("%d", i);
   420      }
   421      printf("\n");
   422  
   423      /* break/continue tests */
   424      i = 0;
   425      do {
   426          if (i == 6)
   427              break;
   428          i++;
   429          if (i == 3)
   430              continue;
   431          printf("%d", i);
   432      } while(1);
   433      printf("\n");
   434  
   435      for(i = 0;i < 10;i++) {
   436          if (i == 3)
   437              continue;
   438          printf("%d", i);
   439      }
   440      printf("\n");
   441  }
   442  
   443  typedef int typedef_and_label;
   444  
   445  void goto_test()
   446  {
   447      int i;
   448      static void *label_table[3] = { &&label1, &&label2, &&label3 };
   449  
   450      printf("goto:\n");
   451      i = 0;
   452      /* This needs to parse as label, not as start of decl.  */
   453   typedef_and_label:
   454   s_loop:
   455      if (i >= 10) 
   456          goto s_end;
   457      printf("%d", i);
   458      i++;
   459      goto s_loop;
   460   s_end:
   461      printf("\n");
   462  
   463      /* we also test computed gotos (GCC extension) */
   464      for(i=0;i<3;i++) {
   465          goto *label_table[i];
   466      label1:
   467          printf("label1\n");
   468          goto next;
   469      label2:
   470          printf("label2\n");
   471          goto next;
   472      label3:
   473          printf("label3\n");
   474      next: ;
   475      }
   476  }
   477  
   478  enum {
   479      E0,
   480      E1 = 2,
   481      E2 = 4,
   482      E3,
   483      E4,
   484  };
   485  
   486  enum test {
   487      E5 = 1000,
   488  };
   489  
   490  void enum_test()
   491  {
   492      enum test b1;
   493      printf("enum:\n%d %d %d %d %d %d\n",
   494             E0, E1, E2, E3, E4, E5);
   495      b1 = 1;
   496      printf("b1=%d\n", b1);
   497  }
   498  
   499  typedef int *my_ptr;
   500  
   501  typedef int mytype1;
   502  typedef int mytype2;
   503  
   504  void typedef_test()
   505  {
   506      my_ptr a;
   507      mytype1 mytype2;
   508      int b;
   509  
   510      a = &b;
   511      *a = 1234;
   512      printf("typedef:\n");
   513      printf("a=%d\n", *a);
   514      mytype2 = 2;
   515      printf("mytype2=%d\n", mytype2);
   516  }
   517  
   518  void forward_test()
   519  {
   520      printf("forward:\n");
   521      forward_ref();
   522      forward_ref();
   523  }
   524  
   525  
   526  void forward_ref(void)
   527  {
   528      printf("forward ok\n");
   529  }
   530  
   531  typedef struct struct1 {
   532      int f1;
   533      int f2, f3;
   534      union union1 {
   535          int v1;
   536          int v2;
   537      } u;
   538      char str[3];
   539  } struct1;
   540  
   541  struct struct2 {
   542      int a;
   543      char b;
   544  };
   545  
   546  union union2 {
   547      int w1;
   548      int w2;
   549  };
   550  
   551  struct struct1 st1, st2;
   552  
   553  int main(int argc, char **argv)
   554  {
   555      string_test();
   556      expr_test();
   557      macro_test();
   558      recursive_macro_test();
   559      scope_test();
   560      forward_test();
   561      funcptr_test();
   562      loop_test();
   563      switch_test();
   564      goto_test();
   565      enum_test();
   566      typedef_test();
   567      struct_test();
   568      array_test();
   569      expr_ptr_test();
   570      bool_test();
   571      expr2_test();
   572      constant_expr_test();
   573      expr_cmp_test();
   574      char_short_test();
   575      init_test();
   576      compound_literal_test();
   577      kr_test();
   578      struct_assign_test();
   579      cast_test();
   580      bitfield_test();
   581      c99_bool_test();
   582      float_test();
   583      longlong_test();
   584      manyarg_test();
   585      stdarg_test();
   586      whitespace_test();
   587      relocation_test();
   588      old_style_function();
   589      alloca_test();
   590      c99_vla_test(5, 2);
   591      sizeof_test();
   592      typeof_test();
   593      statement_expr_test();
   594      local_label_test();
   595      asm_test();
   596      builtin_test();
   597  #ifndef _WIN32
   598      weak_test();
   599  #endif
   600      global_data_test();
   601      cmp_comparison_test();
   602      math_cmp_test();
   603      callsave_test();
   604      builtin_frame_address_test();
   605      return 0; 
   606  }
   607  
   608  int tab[3];
   609  int tab2[3][2];
   610  
   611  int g;
   612  
   613  void f1(g)
   614  {
   615      printf("g1=%d\n", g);
   616  }
   617  
   618  void scope_test()
   619  {
   620      printf("scope:\n");
   621      g = 2;
   622      f1(1);
   623      printf("g2=%d\n", g);
   624      {
   625          int g;
   626          g = 3;
   627          printf("g3=%d\n", g);
   628          {
   629              int g;
   630              g = 4;
   631              printf("g4=%d\n", g);
   632          }
   633      }
   634      printf("g5=%d\n", g);
   635  }
   636  
   637  void array_test()
   638  {
   639      int i, j, a[4];
   640  
   641      printf("array:\n");
   642      printf("sizeof(a) = %d\n", sizeof(a));
   643      printf("sizeof(\"a\") = %d\n", sizeof("a"));
   644  #ifdef C99_MACROS
   645      printf("sizeof(__func__) = %d\n", sizeof(__func__));
   646  #endif
   647      printf("sizeof tab %d\n", sizeof(tab));
   648      printf("sizeof tab2 %d\n", sizeof tab2);
   649      tab[0] = 1;
   650      tab[1] = 2;
   651      tab[2] = 3;
   652      printf("%d %d %d\n", tab[0], tab[1], tab[2]);
   653      for(i=0;i<3;i++)
   654          for(j=0;j<2;j++)
   655              tab2[i][j] = 10 * i + j;
   656      for(i=0;i<3*2;i++) {
   657          printf(" %3d", ((int *)tab2)[i]);
   658      }
   659      printf("\n");
   660      printf("sizeof(size_t)=%d\n", sizeof(size_t));
   661      printf("sizeof(ptrdiff_t)=%d\n", sizeof(ptrdiff_t));
   662  }
   663  
   664  void expr_test()
   665  {
   666      int a, b;
   667      a = 0;
   668      printf("%d\n", a += 1);
   669      printf("%d\n", a -= 2);
   670      printf("%d\n", a *= 31232132);
   671      printf("%d\n", a /= 4);
   672      printf("%d\n", a %= 20);
   673      printf("%d\n", a &= 6);
   674      printf("%d\n", a ^= 7);
   675      printf("%d\n", a |= 8);
   676      printf("%d\n", a >>= 3);
   677      printf("%d\n", a <<= 4);
   678  
   679      a = 22321;
   680      b = -22321;
   681      printf("%d\n", a + 1);
   682      printf("%d\n", a - 2);
   683      printf("%d\n", a * 312);
   684      printf("%d\n", a / 4);
   685      printf("%d\n", b / 4);
   686      printf("%d\n", (unsigned)b / 4);
   687      printf("%d\n", a % 20);
   688      printf("%d\n", b % 20);
   689      printf("%d\n", (unsigned)b % 20);
   690      printf("%d\n", a & 6);
   691      printf("%d\n", a ^ 7);
   692      printf("%d\n", a | 8);
   693      printf("%d\n", a >> 3);
   694      printf("%d\n", b >> 3);
   695      printf("%d\n", (unsigned)b >> 3);
   696      printf("%d\n", a << 4);
   697      printf("%d\n", ~a);
   698      printf("%d\n", -a);
   699      printf("%d\n", +a);
   700  
   701      printf("%d\n", 12 + 1);
   702      printf("%d\n", 12 - 2);
   703      printf("%d\n", 12 * 312);
   704      printf("%d\n", 12 / 4);
   705      printf("%d\n", 12 % 20);
   706      printf("%d\n", 12 & 6);
   707      printf("%d\n", 12 ^ 7);
   708      printf("%d\n", 12 | 8);
   709      printf("%d\n", 12 >> 2);
   710      printf("%d\n", 12 << 4);
   711      printf("%d\n", ~12);
   712      printf("%d\n", -12);
   713      printf("%d\n", +12);
   714      printf("%d %d %d %d\n", 
   715             isid('a'), 
   716             isid('g'), 
   717             isid('T'), 
   718             isid('('));
   719  }
   720  
   721  int isid(int c)
   722  {
   723      return (c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z') | c == '_';
   724  }
   725  
   726  /**********************/
   727  
   728  int vstack[10], *vstack_ptr;
   729  
   730  void vpush(int vt, int vc)
   731  {
   732      *vstack_ptr++ = vt;
   733      *vstack_ptr++ = vc;
   734  }
   735  
   736  void vpop(int *ft, int *fc)
   737  {
   738      *fc = *--vstack_ptr;
   739      *ft = *--vstack_ptr;
   740  }
   741  
   742  void expr2_test()
   743  {
   744      int a, b;
   745  
   746      printf("expr2:\n");
   747      vstack_ptr = vstack;
   748      vpush(1432432, 2);
   749      vstack_ptr[-2] &= ~0xffffff80;
   750      vpop(&a, &b);
   751      printf("res= %d %d\n", a, b);
   752  }
   753  
   754  void constant_expr_test()
   755  {
   756      int a;
   757      printf("constant_expr:\n");
   758      a = 3;
   759      printf("%d\n", a * 16);
   760      printf("%d\n", a * 1);
   761      printf("%d\n", a + 0);
   762  }
   763  
   764  int tab4[10];
   765  
   766  void expr_ptr_test()
   767  {
   768      int *p, *q;
   769      int i = -1;
   770  
   771      printf("expr_ptr:\n");
   772      p = tab4;
   773      q = tab4 + 10;
   774      printf("diff=%d\n", q - p);
   775      p++;
   776      printf("inc=%d\n", p - tab4);
   777      p--;
   778      printf("dec=%d\n", p - tab4);
   779      ++p;
   780      printf("inc=%d\n", p - tab4);
   781      --p;
   782      printf("dec=%d\n", p - tab4);
   783      printf("add=%d\n", p + 3 - tab4);
   784      printf("add=%d\n", 3 + p - tab4);
   785  
   786      /* check if 64bit support is ok */
   787      q = p = 0;
   788      q += i;
   789      printf("%p %p %ld\n", q, p, p-q);
   790      printf("%d %d %d %d %d %d\n",
   791             p == q, p != q, p < q, p <= q, p >= q, p > q);
   792      i = 0xf0000000;
   793      p += i;
   794      printf("%p %p %ld\n", q, p, p-q);
   795      printf("%d %d %d %d %d %d\n",
   796             p == q, p != q, p < q, p <= q, p >= q, p > q);
   797      p = (int *)((char *)p + 0xf0000000);
   798      printf("%p %p %ld\n", q, p, p-q);
   799      printf("%d %d %d %d %d %d\n",
   800             p == q, p != q, p < q, p <= q, p >= q, p > q);
   801      p += 0xf0000000;
   802      printf("%p %p %ld\n", q, p, p-q);
   803      printf("%d %d %d %d %d %d\n",
   804             p == q, p != q, p < q, p <= q, p >= q, p > q);
   805      {
   806          struct size12 {
   807              int i, j, k;
   808          };
   809          struct size12 s[2], *sp = s;
   810          int i, j;
   811          sp->i = 42;
   812          sp++;
   813          j = -1;
   814          printf("%d\n", sp[j].i);
   815      }
   816  }
   817  
   818  void expr_cmp_test()
   819  {
   820      int a, b;
   821      printf("constant_expr:\n");
   822      a = -1;
   823      b = 1;
   824      printf("%d\n", a == a);
   825      printf("%d\n", a != a);
   826  
   827      printf("%d\n", a < b);
   828      printf("%d\n", a <= b);
   829      printf("%d\n", a <= a);
   830      printf("%d\n", b >= a);
   831      printf("%d\n", a >= a);
   832      printf("%d\n", b > a);
   833  
   834      printf("%d\n", (unsigned)a < b);
   835      printf("%d\n", (unsigned)a <= b);
   836      printf("%d\n", (unsigned)a <= a);
   837      printf("%d\n", (unsigned)b >= a);
   838      printf("%d\n", (unsigned)a >= a);
   839      printf("%d\n", (unsigned)b > a);
   840  }
   841  
   842  struct empty {
   843  };
   844  
   845  struct aligntest1 {
   846      char a[10];
   847  };
   848  
   849  struct aligntest2 {
   850      int a;
   851      char b[10];
   852  };
   853  
   854  struct aligntest3 {
   855      double a, b;
   856  };
   857  
   858  struct aligntest4 {
   859      double a[0];
   860  };
   861  
   862  void struct_test()
   863  {
   864      struct1 *s;
   865      union union2 u;
   866  
   867      printf("struct:\n");
   868      printf("sizes: %d %d %d %d\n",
   869             sizeof(struct struct1),
   870             sizeof(struct struct2),
   871             sizeof(union union1),
   872             sizeof(union union2));
   873      st1.f1 = 1;
   874      st1.f2 = 2;
   875      st1.f3 = 3;
   876      printf("st1: %d %d %d\n",
   877             st1.f1, st1.f2, st1.f3);
   878      st1.u.v1 = 1;
   879      st1.u.v2 = 2;
   880      printf("union1: %d\n", st1.u.v1);
   881      u.w1 = 1;
   882      u.w2 = 2;
   883      printf("union2: %d\n", u.w1);
   884      s = &st2;
   885      s->f1 = 3;
   886      s->f2 = 2;
   887      s->f3 = 1;
   888      printf("st2: %d %d %d\n",
   889             s->f1, s->f2, s->f3);
   890      printf("str_addr=%x\n", (int)st1.str - (int)&st1.f1);
   891  
   892      /* align / size tests */
   893      printf("aligntest1 sizeof=%d alignof=%d\n",
   894             sizeof(struct aligntest1), __alignof__(struct aligntest1));
   895      printf("aligntest2 sizeof=%d alignof=%d\n",
   896             sizeof(struct aligntest2), __alignof__(struct aligntest2));
   897      printf("aligntest3 sizeof=%d alignof=%d\n",
   898             sizeof(struct aligntest3), __alignof__(struct aligntest3));
   899      printf("aligntest4 sizeof=%d alignof=%d\n",
   900             sizeof(struct aligntest4), __alignof__(struct aligntest4));
   901             
   902      /* empty structures (GCC extension) */
   903      printf("sizeof(struct empty) = %d\n", sizeof(struct empty));
   904      printf("alignof(struct empty) = %d\n", __alignof__(struct empty));
   905  }
   906  
   907  /* XXX: depend on endianness */
   908  void char_short_test()
   909  {
   910      int var1, var2;
   911  
   912      printf("char_short:\n");
   913  
   914      var1 = 0x01020304;
   915      var2 = 0xfffefdfc;
   916      printf("s8=%d %d\n", 
   917             *(char *)&var1, *(char *)&var2);
   918      printf("u8=%d %d\n", 
   919             *(unsigned char *)&var1, *(unsigned char *)&var2);
   920      printf("s16=%d %d\n", 
   921             *(short *)&var1, *(short *)&var2);
   922      printf("u16=%d %d\n", 
   923             *(unsigned short *)&var1, *(unsigned short *)&var2);
   924      printf("s32=%d %d\n", 
   925             *(int *)&var1, *(int *)&var2);
   926      printf("u32=%d %d\n", 
   927             *(unsigned int *)&var1, *(unsigned int *)&var2);
   928      *(char *)&var1 = 0x08;
   929      printf("var1=%x\n", var1);
   930      *(short *)&var1 = 0x0809;
   931      printf("var1=%x\n", var1);
   932      *(int *)&var1 = 0x08090a0b;
   933      printf("var1=%x\n", var1);
   934  }
   935  
   936  /******************/
   937  
   938  typedef struct Sym {
   939      int v;
   940      int t;
   941      int c;
   942      struct Sym *next;
   943      struct Sym *prev;
   944  } Sym;
   945  
   946  #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
   947  #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
   948  
   949  static int toupper1(int a)
   950  {
   951      return TOUPPER(a);
   952  }
   953  
   954  void bool_test()
   955  {
   956      int *s, a, b, t, f, i;
   957  
   958      a = 0;
   959      s = (void*)0;
   960      printf("!s=%d\n", !s);
   961  
   962      if (!s || !s[0])
   963          a = 1;
   964      printf("a=%d\n", a);
   965  
   966      printf("a=%d %d %d\n", 0 || 0, 0 || 1, 1 || 1);
   967      printf("a=%d %d %d\n", 0 && 0, 0 && 1, 1 && 1);
   968      printf("a=%d %d\n", 1 ? 1 : 0, 0 ? 1 : 0);
   969  #if 1 && 1
   970      printf("a1\n");
   971  #endif
   972  #if 1 || 0
   973      printf("a2\n");
   974  #endif
   975  #if 1 ? 0 : 1
   976      printf("a3\n");
   977  #endif
   978  #if 0 ? 0 : 1
   979      printf("a4\n");
   980  #endif
   981  
   982      a = 4;
   983      printf("b=%d\n", a + (0 ? 1 : a / 2));
   984  
   985      /* test register spilling */
   986      a = 10;
   987      b = 10;
   988      a = (a + b) * ((a < b) ?
   989                     ((b - a) * (a - b)): a + b);
   990      printf("a=%d\n", a);
   991  
   992      /* test complex || or && expressions */
   993      t = 1;
   994      f = 0;
   995      a = 32;
   996      printf("exp=%d\n", f == (32 <= a && a <= 3));
   997      printf("r=%d\n", (t || f) + (t && f));
   998  
   999      /* test ? : cast */
  1000      {
  1001          int aspect_on;
  1002          int aspect_native = 65536;
  1003          double bfu_aspect = 1.0;
  1004          int aspect;
  1005          for(aspect_on = 0; aspect_on < 2; aspect_on++) {
  1006              aspect=aspect_on?(aspect_native*bfu_aspect+0.5):65535UL;
  1007              printf("aspect=%d\n", aspect);
  1008          }
  1009      }
  1010  
  1011      /* test ? : GCC extension */
  1012      {
  1013          static int v1 = 34 ? : -1; /* constant case */
  1014          static int v2 = 0 ? : -1; /* constant case */
  1015          int a = 30;
  1016          
  1017          printf("%d %d\n", v1, v2);
  1018          printf("%d %d\n", a - 30 ? : a * 2, a + 1 ? : a * 2);
  1019      }
  1020  
  1021      /* again complex expression */
  1022      for(i=0;i<256;i++) {
  1023          if (toupper1 (i) != TOUPPER (i))
  1024              printf("error %d\n", i);
  1025      }
  1026  }
  1027  
  1028  /* GCC accepts that */
  1029  static int tab_reinit[];
  1030  static int tab_reinit[10];
  1031  
  1032  //int cinit1; /* a global variable can be defined several times without error ! */
  1033  int cinit1; 
  1034  int cinit1; 
  1035  int cinit1 = 0;
  1036  int *cinit2 = (int []){3, 2, 1};
  1037  
  1038  void compound_literal_test(void)
  1039  {
  1040      int *p, i;
  1041      char *q, *q3;
  1042  
  1043      printf("compound_test:\n");
  1044  
  1045      p = (int []){1, 2, 3};
  1046      for(i=0;i<3;i++)
  1047          printf(" %d", p[i]);
  1048      printf("\n");
  1049  
  1050      for(i=0;i<3;i++)
  1051          printf("%d", cinit2[i]);
  1052      printf("\n");
  1053  
  1054      q = "tralala1";
  1055      printf("q1=%s\n", q);
  1056  
  1057      q = (char *){ "tralala2" };
  1058      printf("q2=%s\n", q);
  1059  
  1060      q3 = (char *){ q };
  1061      printf("q3=%s\n", q3);
  1062  
  1063      q = (char []){ "tralala3" };
  1064      printf("q4=%s\n", q);
  1065  
  1066  #ifdef ALL_ISOC99
  1067      p = (int []){1, 2, cinit1 + 3};
  1068      for(i=0;i<3;i++)
  1069          printf(" %d", p[i]);
  1070      printf("\n");
  1071  
  1072      for(i=0;i<3;i++) {
  1073          p = (int []){1, 2, 4 + i};
  1074          printf("%d %d %d\n", 
  1075                 p[0],
  1076                 p[1],
  1077                 p[2]);
  1078      }
  1079  #endif
  1080  }
  1081  
  1082  /* K & R protos */
  1083  
  1084  kr_func1(a, b)
  1085  {
  1086      return a + b;
  1087  }
  1088  
  1089  int kr_func2(a, b)
  1090  {
  1091      return a + b;
  1092  }
  1093  
  1094  kr_test()
  1095  {
  1096      printf("kr_test:\n");
  1097      printf("func1=%d\n", kr_func1(3, 4));
  1098      printf("func2=%d\n", kr_func2(3, 4));
  1099      return 0;
  1100  }
  1101  
  1102  void num(int n)
  1103  {
  1104      char *tab, *p;
  1105      tab = (char*)malloc(20); 
  1106      p = tab;
  1107      while (1) {
  1108          *p = 48 + (n % 10);
  1109          p++;
  1110          n = n / 10;
  1111          if (n == 0)
  1112              break;
  1113      }
  1114      while (p != tab) {
  1115          p--;
  1116          printf("%c", *p);
  1117      }
  1118      printf("\n");
  1119      free(tab);
  1120  }
  1121  
  1122  /* structure assignment tests */
  1123  struct structa1 {
  1124      int f1;
  1125      char f2;
  1126  };
  1127  
  1128  struct structa1 ssta1;
  1129  
  1130  void struct_assign_test1(struct structa1 s1, int t, float f)
  1131  {
  1132      printf("%d %d %d %f\n", s1.f1, s1.f2, t, f);
  1133  }
  1134  
  1135  struct structa1 struct_assign_test2(struct structa1 s1, int t)
  1136  {
  1137      s1.f1 += t;
  1138      s1.f2 -= t;
  1139      return s1;
  1140  }
  1141  
  1142  void struct_assign_test(void)
  1143  {
  1144      struct S {
  1145        struct structa1 lsta1, lsta2;
  1146        int i;
  1147      } s, *ps;
  1148      
  1149      ps = &s;
  1150      ps->i = 4;
  1151  #if 0
  1152      printf("struct_assign_test:\n");
  1153  
  1154      s.lsta1.f1 = 1;
  1155      s.lsta1.f2 = 2;
  1156      printf("%d %d\n", s.lsta1.f1, s.lsta1.f2);
  1157      s.lsta2 = s.lsta1;
  1158      printf("%d %d\n", s.lsta2.f1, s.lsta2.f2);
  1159  #else
  1160      s.lsta2.f1 = 1;
  1161      s.lsta2.f2 = 2;
  1162  #endif
  1163      struct_assign_test1(ps->lsta2, 3, 4.5);
  1164      
  1165      printf("before call: %d %d\n", s.lsta2.f1, s.lsta2.f2);
  1166      ps->lsta2 = struct_assign_test2(ps->lsta2, ps->i);
  1167      printf("after call: %d %d\n", ps->lsta2.f1, ps->lsta2.f2);
  1168  
  1169      static struct {
  1170          void (*elem)();
  1171      } t[] = {
  1172          /* XXX: we should allow this even without braces */
  1173          { struct_assign_test }
  1174      };
  1175      printf("%d\n", struct_assign_test == t[0].elem);
  1176  }
  1177  
  1178  /* casts to short/char */
  1179  
  1180  void cast1(char a, short b, unsigned char c, unsigned short d)
  1181  {
  1182      printf("%d %d %d %d\n", a, b, c, d);
  1183  }
  1184  
  1185  char bcast;
  1186  short scast;
  1187  
  1188  void cast_test()
  1189  {
  1190      int a;
  1191      char c;
  1192      char tab[10];
  1193      unsigned b,d;
  1194      short s;
  1195      char *p = NULL;
  1196      p -= 0x700000000042;
  1197  
  1198      printf("cast_test:\n");
  1199      a = 0xfffff;
  1200      cast1(a, a, a, a);
  1201      a = 0xffffe;
  1202      printf("%d %d %d %d\n",
  1203             (char)(a + 1),
  1204             (short)(a + 1),
  1205             (unsigned char)(a + 1),
  1206             (unsigned short)(a + 1));
  1207      printf("%d %d %d %d\n",
  1208             (char)0xfffff,
  1209             (short)0xfffff,
  1210             (unsigned char)0xfffff,
  1211             (unsigned short)0xfffff);
  1212  
  1213      a = (bcast = 128) + 1;
  1214      printf("%d\n", a);
  1215      a = (scast = 65536) + 1;
  1216      printf("%d\n", a);
  1217      
  1218      printf("sizeof(c) = %d, sizeof((int)c) = %d\n", sizeof(c), sizeof((int)c));
  1219      
  1220      /* test cast from unsigned to signed short to int */
  1221      b = 0xf000;
  1222      d = (short)b;
  1223      printf("((unsigned)(short)0x%08x) = 0x%08x\n", b, d);
  1224      b = 0xf0f0;
  1225      d = (char)b;
  1226      printf("((unsigned)(char)0x%08x) = 0x%08x\n", b, d);
  1227      
  1228      /* test implicit int casting for array accesses */
  1229      c = 0;
  1230      tab[1] = 2;
  1231      tab[c] = 1;
  1232      printf("%d %d\n", tab[0], tab[1]);
  1233  
  1234      /* test implicit casting on some operators */
  1235      printf("sizeof(+(char)'a') = %d\n", sizeof(+(char)'a'));
  1236      printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a'));
  1237      printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a'));
  1238  
  1239      /* from pointer to integer types */
  1240      printf("%d %d %ld %ld %lld %lld\n",
  1241             (int)p, (unsigned int)p,
  1242             (long)p, (unsigned long)p,
  1243             (long long)p, (unsigned long long)p);
  1244  
  1245      /* from integers to pointers */
  1246      printf("%p %p %p %p\n",
  1247             (void *)a, (void *)b, (void *)c, (void *)d);
  1248  }
  1249  
  1250  /* initializers tests */
  1251  struct structinit1 {
  1252      int f1;
  1253      char f2;
  1254      short f3;
  1255      int farray[3];
  1256  };
  1257  
  1258  int sinit1 = 2;
  1259  int sinit2 = { 3 };
  1260  int sinit3[3] = { 1, 2, {{3}}, };
  1261  int sinit4[3][2] = { {1, 2}, {3, 4}, {5, 6} };
  1262  int sinit5[3][2] = { 1, 2, 3, 4, 5, 6 };
  1263  int sinit6[] = { 1, 2, 3 };
  1264  int sinit7[] = { [2] = 3, [0] = 1, 2 };
  1265  char sinit8[] = "hello" "trala";
  1266  
  1267  struct structinit1 sinit9 = { 1, 2, 3 };
  1268  struct structinit1 sinit10 = { .f2 = 2, 3, .f1 = 1 };
  1269  struct structinit1 sinit11 = { .f2 = 2, 3, .f1 = 1, 
  1270  #ifdef ALL_ISOC99
  1271                                 .farray[0] = 10,
  1272                                 .farray[1] = 11,
  1273                                 .farray[2] = 12,
  1274  #endif
  1275  };
  1276  
  1277  char *sinit12 = "hello world";
  1278  char *sinit13[] = {
  1279      "test1",
  1280      "test2",
  1281      "test3",
  1282  };
  1283  char sinit14[10] = { "abc" };
  1284  int sinit15[3] = { sizeof(sinit15), 1, 2 };
  1285  
  1286  struct { int a[3], b; } sinit16[] = { { 1 }, 2 };
  1287  
  1288  struct bar {
  1289          char *s;
  1290          int len;
  1291  } sinit17[] = {
  1292          "a1", 4,
  1293          "a2", 1
  1294  };
  1295  
  1296  int sinit18[10] = {
  1297      [2 ... 5] = 20,
  1298      2,
  1299      [8] = 10,
  1300  };
  1301  
  1302  struct complexinit0 {
  1303      int a;
  1304      int b;
  1305  };
  1306  
  1307  struct complexinit {
  1308      int a;
  1309      const struct complexinit0 *b;
  1310  };
  1311  
  1312  const static struct complexinit cix[] = {
  1313      [0] = {
  1314  	.a = 2000,
  1315  	.b = (const struct complexinit0[]) {
  1316  		{ 2001, 2002 },
  1317  		{ 2003, 2003 },
  1318  		{}
  1319  	}
  1320      }
  1321  };
  1322  
  1323  struct complexinit2 {
  1324  	int a;
  1325  	int b[];
  1326  };
  1327  
  1328  struct complexinit2 cix20;
  1329  
  1330  struct complexinit2 cix21 = {
  1331  	.a = 3000,
  1332  	.b = { 3001, 3002, 3003 }
  1333  };
  1334  
  1335  struct complexinit2 cix22 = {
  1336  	.a = 4000,
  1337  	.b = { 4001, 4002, 4003, 4004, 4005, 4006 }
  1338  };
  1339  
  1340  void init_test(void)
  1341  {
  1342      int linit1 = 2;
  1343      int linit2 = { 3 };
  1344      int linit4[3][2] = { {1, 2}, {3, 4}, {5, 6} };
  1345      int linit6[] = { 1, 2, 3 };
  1346      int i, j;
  1347      char linit8[] = "hello" "trala";
  1348      int linit12[10] = { 1, 2 };
  1349      int linit13[10] = { 1, 2, [7] = 3, [3] = 4, };
  1350      char linit14[10] = "abc";
  1351      int linit15[10] = { linit1, linit1 + 1, [6] = linit1 + 2, };
  1352      struct linit16 { int a1, a2, a3, a4; } linit16 = { 1, .a3 = 2 };
  1353      int linit17 = sizeof(linit17);
  1354      
  1355      printf("init_test:\n");
  1356  
  1357      printf("sinit1=%d\n", sinit1);
  1358      printf("sinit2=%d\n", sinit2);
  1359      printf("sinit3=%d %d %d %d\n", 
  1360             sizeof(sinit3),
  1361             sinit3[0],
  1362             sinit3[1],
  1363             sinit3[2]
  1364             );
  1365      printf("sinit6=%d\n", sizeof(sinit6));
  1366      printf("sinit7=%d %d %d %d\n", 
  1367             sizeof(sinit7),
  1368             sinit7[0],
  1369             sinit7[1],
  1370             sinit7[2]
  1371             );
  1372      printf("sinit8=%s\n", sinit8);
  1373      printf("sinit9=%d %d %d\n", 
  1374             sinit9.f1,
  1375             sinit9.f2,
  1376             sinit9.f3
  1377             );
  1378      printf("sinit10=%d %d %d\n", 
  1379             sinit10.f1,
  1380             sinit10.f2,
  1381             sinit10.f3
  1382             );
  1383      printf("sinit11=%d %d %d %d %d %d\n", 
  1384             sinit11.f1,
  1385             sinit11.f2,
  1386             sinit11.f3,
  1387             sinit11.farray[0],
  1388             sinit11.farray[1],
  1389             sinit11.farray[2]
  1390             );
  1391  
  1392      for(i=0;i<3;i++)
  1393          for(j=0;j<2;j++)
  1394              printf("[%d][%d] = %d %d %d\n", 
  1395                     i, j, sinit4[i][j], sinit5[i][j], linit4[i][j]);
  1396      printf("linit1=%d\n", linit1);
  1397      printf("linit2=%d\n", linit2);
  1398      printf("linit6=%d\n", sizeof(linit6));
  1399      printf("linit8=%d %s\n", sizeof(linit8), linit8);
  1400  
  1401      printf("sinit12=%s\n", sinit12);
  1402      printf("sinit13=%d %s %s %s\n",
  1403             sizeof(sinit13), 
  1404             sinit13[0],
  1405             sinit13[1],
  1406             sinit13[2]);
  1407      printf("sinit14=%s\n", sinit14);
  1408  
  1409      for(i=0;i<10;i++) printf(" %d", linit12[i]);
  1410      printf("\n");
  1411      for(i=0;i<10;i++) printf(" %d", linit13[i]);
  1412      printf("\n");
  1413      for(i=0;i<10;i++) printf(" %d", linit14[i]);
  1414      printf("\n");
  1415      for(i=0;i<10;i++) printf(" %d", linit15[i]);
  1416      printf("\n");
  1417      printf("%d %d %d %d\n", 
  1418             linit16.a1,
  1419             linit16.a2,
  1420             linit16.a3,
  1421             linit16.a4);
  1422      /* test that initialisation is done after variable declare */
  1423      printf("linit17=%d\n", linit17);
  1424      printf("sinit15=%d\n", sinit15[0]);
  1425      printf("sinit16=%d %d\n", sinit16[0].a[0], sinit16[1].a[0]);
  1426      printf("sinit17=%s %d %s %d\n",
  1427             sinit17[0].s, sinit17[0].len,
  1428             sinit17[1].s, sinit17[1].len);
  1429      for(i=0;i<10;i++)
  1430          printf("%x ", sinit18[i]);
  1431      printf("\n");
  1432      /* complex init check */
  1433      printf("cix: %d %d %d %d %d %d %d\n",
  1434  	cix[0].a,
  1435  	cix[0].b[0].a, cix[0].b[0].b,
  1436  	cix[0].b[1].a, cix[0].b[1].b,
  1437  	cix[0].b[2].a, cix[0].b[2].b);
  1438      printf("cix2: %d %d\n", cix21.b[2], cix22.b[5]);
  1439      printf("sizeof cix20 %d, cix21 %d, sizeof cix22 %d\n", sizeof cix20, sizeof cix21, sizeof cix22);
  1440  }
  1441  
  1442  
  1443  void switch_test()
  1444  {
  1445      int i;
  1446  
  1447      for(i=0;i<15;i++) {
  1448          switch(i) {
  1449          case 0:
  1450          case 1:
  1451              printf("a");
  1452              break;
  1453          default:
  1454              printf("%d", i);
  1455              break;
  1456          case 8 ... 12:
  1457              printf("c");
  1458              break;
  1459          case 3:
  1460              printf("b");
  1461              break;
  1462          }
  1463      }
  1464      printf("\n");
  1465  }
  1466  
  1467  /* ISOC99 _Bool type */
  1468  void c99_bool_test(void)
  1469  {
  1470  #ifdef BOOL_ISOC99
  1471      int a;
  1472      _Bool b;
  1473  
  1474      printf("bool_test:\n");
  1475      printf("sizeof(_Bool) = %d\n", sizeof(_Bool));
  1476      a = 3;
  1477      printf("cast: %d %d %d\n", (_Bool)10, (_Bool)0, (_Bool)a);
  1478      b = 3;
  1479      printf("b = %d\n", b);
  1480      b++;
  1481      printf("b = %d\n", b);
  1482  #endif
  1483  }
  1484  
  1485  void bitfield_test(void)
  1486  {
  1487      int a;
  1488      short sa;
  1489      unsigned char ca;
  1490      struct sbf1 {
  1491          int f1 : 3;
  1492          int : 2;
  1493          int f2 : 1;
  1494          int : 0;
  1495          int f3 : 5;
  1496          int f4 : 7;
  1497          unsigned int f5 : 7;
  1498      } st1;
  1499      printf("bitfield_test:");
  1500      printf("sizeof(st1) = %d\n", sizeof(st1));
  1501  
  1502      st1.f1 = 3;
  1503      st1.f2 = 1;
  1504      st1.f3 = 15;
  1505      a = 120;
  1506      st1.f4 = a;
  1507      st1.f5 = a;
  1508      st1.f5++;
  1509      printf("%d %d %d %d %d\n",
  1510             st1.f1, st1.f2, st1.f3, st1.f4, st1.f5);
  1511      sa = st1.f5;
  1512      ca = st1.f5;
  1513      printf("%d %d\n", sa, ca);
  1514  
  1515      st1.f1 = 7;
  1516      if (st1.f1 == -1) 
  1517          printf("st1.f1 == -1\n");
  1518      else 
  1519          printf("st1.f1 != -1\n");
  1520      if (st1.f2 == -1) 
  1521          printf("st1.f2 == -1\n");
  1522      else 
  1523          printf("st1.f2 != -1\n");
  1524  
  1525      /* bit sizes below must be bigger than 32 since GCC doesn't allow
  1526         long-long bitfields whose size is not bigger than int */
  1527      struct sbf2 {
  1528          long long f1 : 45;
  1529          long long : 2;
  1530          long long f2 : 35;
  1531          unsigned long long f3 : 38;
  1532      } st2;
  1533      st2.f1 = 0x123456789ULL;
  1534      a = 120;
  1535      st2.f2 = (long long)a << 25;
  1536      st2.f3 = a;
  1537      st2.f2++;
  1538      printf("%lld %lld %lld\n", st2.f1, st2.f2, st2.f3);
  1539  }
  1540  
  1541  #ifdef __x86_64__
  1542  #define FLOAT_FMT "%f\n"
  1543  #else
  1544  /* x86's float isn't compatible with GCC */
  1545  #define FLOAT_FMT "%.5f\n"
  1546  #endif
  1547  
  1548  /* declare strto* functions as they are C99 */
  1549  double strtod(const char *nptr, char **endptr);
  1550  float strtof(const char *nptr, char **endptr);
  1551  long double strtold(const char *nptr, char **endptr);
  1552  
  1553  #define FTEST(prefix, type, fmt)\
  1554  void prefix ## cmp(type a, type b)\
  1555  {\
  1556      printf("%d %d %d %d %d %d\n",\
  1557             a == b,\
  1558             a != b,\
  1559             a < b,\
  1560             a > b,\
  1561             a >= b,\
  1562             a <= b);\
  1563      printf(fmt " " fmt " " fmt " " fmt " " fmt " " fmt " " fmt "\n",\
  1564             a,\
  1565             b,\
  1566             a + b,\
  1567             a - b,\
  1568             a * b,\
  1569             a / b,\
  1570             -a);\
  1571      printf(fmt "\n", ++a);\
  1572      printf(fmt "\n", a++);\
  1573      printf(fmt "\n", a);\
  1574      b = 0;\
  1575      printf("%d %d\n", !a, !b);\
  1576  }\
  1577  void prefix ## fcast(type a)\
  1578  {\
  1579      float fa;\
  1580      double da;\
  1581      long double la;\
  1582      int ia;\
  1583      unsigned int ua;\
  1584      type b;\
  1585      fa = a;\
  1586      da = a;\
  1587      la = a;\
  1588      printf("ftof: %f %f %Lf\n", fa, da, la);\
  1589      ia = (int)a;\
  1590      ua = (unsigned int)a;\
  1591      printf("ftoi: %d %u\n", ia, ua);\
  1592      ia = -1234;\
  1593      ua = 0x81234500;\
  1594      b = ia;\
  1595      printf("itof: " fmt "\n", b);\
  1596      b = ua;\
  1597      printf("utof: " fmt "\n", b);\
  1598  }\
  1599  \
  1600  float prefix ## retf(type a) { return a; }\
  1601  double prefix ## retd(type a) { return a; }\
  1602  long double prefix ## retld(type a) { return a; }\
  1603  \
  1604  void prefix ## call(void)\
  1605  {\
  1606      printf("float: " FLOAT_FMT, prefix ## retf(42.123456789));\
  1607      printf("double: %f\n", prefix ## retd(42.123456789));\
  1608      printf("long double: %Lf\n", prefix ## retld(42.123456789));\
  1609      printf("strto%s: %f\n", #prefix, (double)strto ## prefix("1.2", NULL));\
  1610  }\
  1611  \
  1612  void prefix ## test(void)\
  1613  {\
  1614      printf("testing '%s'\n", #type);\
  1615      prefix ## cmp(1, 2.5);\
  1616      prefix ## cmp(2, 1.5);\
  1617      prefix ## cmp(1, 1);\
  1618      prefix ## fcast(234.6);\
  1619      prefix ## fcast(-2334.6);\
  1620      prefix ## call();\
  1621  }
  1622  
  1623  FTEST(f, float, "%f")
  1624  FTEST(d, double, "%f")
  1625  FTEST(ld, long double, "%Lf")
  1626  
  1627  double ftab1[3] = { 1.2, 3.4, -5.6 };
  1628  
  1629  
  1630  void float_test(void)
  1631  {
  1632      float fa, fb;
  1633      double da, db;
  1634      int a;
  1635      unsigned int b;
  1636  
  1637      printf("float_test:\n");
  1638      printf("sizeof(float) = %d\n", sizeof(float));
  1639      printf("sizeof(double) = %d\n", sizeof(double));
  1640      printf("sizeof(long double) = %d\n", sizeof(long double));
  1641      ftest();
  1642      dtest();
  1643      ldtest();
  1644      printf("%f %f %f\n", ftab1[0], ftab1[1], ftab1[2]);
  1645      printf("%f %f %f\n", 2.12, .5, 2.3e10);
  1646      //    printf("%f %f %f\n", 0x1234p12, 0x1e23.23p10, 0x12dp-10);
  1647      da = 123;
  1648      printf("da=%f\n", da);
  1649      fa = 123;
  1650      printf("fa=%f\n", fa);
  1651      a = 4000000000;
  1652      da = a;
  1653      printf("da = %f\n", da);
  1654      b = 4000000000;
  1655      db = b;
  1656      printf("db = %f\n", db);
  1657  }
  1658  
  1659  int fib(int n)
  1660  {
  1661      if (n <= 2)
  1662          return 1;
  1663      else
  1664          return fib(n-1) + fib(n-2);
  1665  }
  1666  
  1667  void funcptr_test()
  1668  {
  1669      void (*func)(int);
  1670      int a;
  1671      struct {
  1672          int dummy;
  1673          void (*func)(int);
  1674      } st1;
  1675  
  1676      printf("funcptr:\n");
  1677      func = &num;
  1678      (*func)(12345);
  1679      func = num;
  1680      a = 1;
  1681      a = 1;
  1682      func(12345);
  1683      /* more complicated pointer computation */
  1684      st1.func = num;
  1685      st1.func(12346);
  1686      printf("sizeof1 = %d\n", sizeof(funcptr_test));
  1687      printf("sizeof2 = %d\n", sizeof funcptr_test);
  1688      printf("sizeof3 = %d\n", sizeof(&funcptr_test));
  1689      printf("sizeof4 = %d\n", sizeof &funcptr_test);
  1690  }
  1691  
  1692  void lloptest(long long a, long long b)
  1693  {
  1694      unsigned long long ua, ub;
  1695  
  1696      ua = a;
  1697      ub = b;
  1698      /* arith */
  1699      printf("arith: %Ld %Ld %Ld\n",
  1700             a + b,
  1701             a - b,
  1702             a * b);
  1703      
  1704      if (b != 0) {
  1705          printf("arith1: %Ld %Ld\n",
  1706             a / b,
  1707             a % b);
  1708      }
  1709  
  1710      /* binary */
  1711      printf("bin: %Ld %Ld %Ld\n",
  1712             a & b,
  1713             a | b,
  1714             a ^ b);
  1715  
  1716      /* tests */
  1717      printf("test: %d %d %d %d %d %d\n",
  1718             a == b,
  1719             a != b,
  1720             a < b,
  1721             a > b,
  1722             a >= b,
  1723             a <= b);
  1724      
  1725      printf("utest: %d %d %d %d %d %d\n",
  1726             ua == ub,
  1727             ua != ub,
  1728             ua < ub,
  1729             ua > ub,
  1730             ua >= ub,
  1731             ua <= ub);
  1732  
  1733      /* arith2 */
  1734      a++;
  1735      b++;
  1736      printf("arith2: %Ld %Ld\n", a, b);
  1737      printf("arith2: %Ld %Ld\n", a++, b++);
  1738      printf("arith2: %Ld %Ld\n", --a, --b);
  1739      printf("arith2: %Ld %Ld\n", a, b);
  1740      b = ub = 0;
  1741      printf("not: %d %d %d %d\n", !a, !ua, !b, !ub);
  1742  }
  1743  
  1744  void llshift(long long a, int b)
  1745  {
  1746      printf("shift: %Ld %Ld %Ld\n",
  1747             (unsigned long long)a >> b,
  1748             a >> b,
  1749             a << b);
  1750      printf("shiftc: %Ld %Ld %Ld\n",
  1751             (unsigned long long)a >> 3,
  1752             a >> 3,
  1753             a << 3);
  1754      printf("shiftc: %Ld %Ld %Ld\n",
  1755             (unsigned long long)a >> 35,
  1756             a >> 35,
  1757             a << 35);
  1758  }
  1759  
  1760  void llfloat(void)
  1761  {
  1762      float fa;
  1763      double da;
  1764      long double lda;
  1765      long long la, lb, lc;
  1766      unsigned long long ula, ulb, ulc;
  1767      la = 0x12345678;
  1768      ula = 0x72345678;
  1769      la = (la << 20) | 0x12345;
  1770      ula = ula << 33;
  1771      printf("la=%Ld ula=%Lu\n", la, ula);
  1772  
  1773      fa = la;
  1774      da = la;
  1775      lda = la;
  1776      printf("lltof: %f %f %Lf\n", fa, da, lda);
  1777  
  1778      la = fa;
  1779      lb = da;
  1780      lc = lda;
  1781      printf("ftoll: %Ld %Ld %Ld\n", la, lb, lc);
  1782  
  1783      fa = ula;
  1784      da = ula;
  1785      lda = ula;
  1786      printf("ulltof: %f %f %Lf\n", fa, da, lda);
  1787  
  1788      ula = fa;
  1789      ulb = da;
  1790      ulc = lda;
  1791      printf("ftoull: %Lu %Lu %Lu\n", ula, ulb, ulc);
  1792  }
  1793  
  1794  long long llfunc1(int a)
  1795  {
  1796      return a * 2;
  1797  }
  1798  
  1799  struct S {
  1800      int id; 
  1801      char item;
  1802  };
  1803  
  1804  long long int value(struct S *v)
  1805  {
  1806      return ((long long int)v->item);
  1807  }
  1808  
  1809  void longlong_test(void)
  1810  {
  1811      long long a, b, c;
  1812      int ia;
  1813      unsigned int ua;
  1814      printf("longlong_test:\n");
  1815      printf("sizeof(long long) = %d\n", sizeof(long long));
  1816      ia = -1;
  1817      ua = -2;
  1818      a = ia;
  1819      b = ua;
  1820      printf("%Ld %Ld\n", a, b);
  1821      printf("%Ld %Ld %Ld %Lx\n", 
  1822             (long long)1, 
  1823             (long long)-2,
  1824             1LL,
  1825             0x1234567812345679);
  1826      a = llfunc1(-3);
  1827      printf("%Ld\n", a);
  1828  
  1829      lloptest(1000, 23);
  1830      lloptest(0xff, 0x1234);
  1831      b = 0x72345678 << 10;
  1832      lloptest(-3, b);
  1833      llshift(0x123, 5);
  1834      llshift(-23, 5);
  1835      b = 0x72345678LL << 10;
  1836      llshift(b, 47);
  1837  
  1838      llfloat();
  1839  #if 1
  1840      b = 0x12345678;
  1841      a = -1;
  1842      c = a + b;
  1843      printf("%Lx\n", c);
  1844  #endif
  1845  
  1846      /* long long reg spill test */
  1847      {
  1848            struct S a;
  1849  
  1850            a.item = 3;
  1851            printf("%lld\n", value(&a));
  1852      }
  1853      lloptest(0x80000000, 0);
  1854  
  1855      /* another long long spill test */
  1856      {
  1857          long long *p, v;
  1858          v = 1;
  1859          p = &v;
  1860          p[0]++;
  1861          printf("%lld\n", *p);
  1862      }
  1863  
  1864      a = 68719476720LL;
  1865      b = 4294967295LL;
  1866      printf("%d %d %d %d\n", a > b, a < b, a >= b, a <= b);
  1867  
  1868      printf("%Ld\n", 0x123456789LLU);
  1869  }
  1870  
  1871  void manyarg_test(void)
  1872  {
  1873      long double ld = 1234567891234LL;
  1874      printf("manyarg_test:\n");
  1875      printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\n",
  1876             1, 2, 3, 4, 5, 6, 7, 8,
  1877             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0);
  1878      printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  1879             "%Ld %Ld %f %f\n",
  1880             1, 2, 3, 4, 5, 6, 7, 8,
  1881             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  1882             1234567891234LL, 987654321986LL,
  1883             42.0, 43.0);
  1884      printf("%Lf %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  1885             "%Ld %Ld %f %f\n",
  1886             ld, 1, 2, 3, 4, 5, 6, 7, 8,
  1887             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  1888             1234567891234LL, 987654321986LL,
  1889             42.0, 43.0);
  1890      /* XXX: known bug of x86-64 */
  1891  #ifndef __x86_64__
  1892      printf("%d %d %d %d %d %d %d %d %Lf\n",
  1893             1, 2, 3, 4, 5, 6, 7, 8, ld);
  1894      printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  1895             "%Ld %Ld %f %f %Lf\n",
  1896             1, 2, 3, 4, 5, 6, 7, 8,
  1897             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  1898             1234567891234LL, 987654321986LL,
  1899             42.0, 43.0, ld);
  1900      printf("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  1901             "%Lf %Ld %Ld %f %f %Lf\n",
  1902             1, 2, 3, 4, 5, 6, 7, 8,
  1903             0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  1904             ld, 1234567891234LL, 987654321986LL,
  1905             42.0, 43.0, ld);
  1906  #endif
  1907  }
  1908  
  1909  void vprintf1(const char *fmt, ...)
  1910  {
  1911      va_list ap, aq;
  1912      const char *p;
  1913      int c, i;
  1914      double d;
  1915      long long ll;
  1916      long double ld;
  1917  
  1918      va_start(aq, fmt);
  1919      va_copy(ap, aq);
  1920      
  1921      p = fmt;
  1922      for(;;) {
  1923          c = *p;
  1924          if (c == '\0')
  1925              break;
  1926          p++;
  1927          if (c == '%') {
  1928              c = *p;
  1929              switch(c) {
  1930              case '\0':
  1931                  goto the_end;
  1932              case 'd':
  1933                  i = va_arg(ap, int);
  1934                  printf("%d", i);
  1935                  break;
  1936              case 'f':
  1937                  d = va_arg(ap, double);
  1938                  printf("%f", d);
  1939                  break;
  1940              case 'l':
  1941                  ll = va_arg(ap, long long);
  1942                  printf("%Ld", ll);
  1943                  break;
  1944              case 'F':
  1945                  ld = va_arg(ap, long double);
  1946                  printf("%Lf", ld);
  1947                  break;
  1948              }
  1949              p++;
  1950          } else {
  1951              putchar(c);
  1952          }
  1953      }
  1954   the_end:
  1955      va_end(aq);
  1956      va_end(ap);
  1957  }
  1958  
  1959  struct myspace {
  1960      short int profile;
  1961  };
  1962  
  1963  void stdarg_for_struct(struct myspace bob, ...)
  1964  {
  1965      struct myspace george, bill;
  1966      va_list ap;
  1967      short int validate;
  1968  
  1969      va_start(ap, bob);
  1970      bill     = va_arg(ap, struct myspace);
  1971      george   = va_arg(ap, struct myspace);
  1972      validate = va_arg(ap, int);
  1973      printf("stdarg_for_struct: %d %d %d %d\n",
  1974             bob.profile, bill.profile, george.profile, validate);
  1975      va_end(ap);
  1976  }
  1977  
  1978  void stdarg_test(void)
  1979  {
  1980      long double ld = 1234567891234LL;
  1981      struct myspace bob;
  1982  
  1983      vprintf1("%d %d %d\n", 1, 2, 3);
  1984      vprintf1("%f %d %f\n", 1.0, 2, 3.0);
  1985      vprintf1("%l %l %d %f\n", 1234567891234LL, 987654321986LL, 3, 1234.0);
  1986      vprintf1("%F %F %F\n", 1.2L, 2.3L, 3.4L);
  1987  #ifdef __x86_64__
  1988      /* a bug of x86's TCC */
  1989      vprintf1("%d %f %l %F %d %f %l %F\n",
  1990               1, 1.2, 3L, 4.5L, 6, 7.8, 9L, 0.1L);
  1991  #endif
  1992      vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f\n",
  1993               1, 2, 3, 4, 5, 6, 7, 8,
  1994               0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8);
  1995      vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f\n",
  1996               1, 2, 3, 4, 5, 6, 7, 8,
  1997               0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0);
  1998      vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  1999               "%l %l %f %f\n",
  2000               1, 2, 3, 4, 5, 6, 7, 8,
  2001               0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  2002               1234567891234LL, 987654321986LL,
  2003               42.0, 43.0);
  2004      vprintf1("%F %d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  2005               "%l %l %f %f\n",
  2006               ld, 1, 2, 3, 4, 5, 6, 7, 8,
  2007               0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  2008               1234567891234LL, 987654321986LL,
  2009               42.0, 43.0);
  2010      vprintf1("%d %d %d %d %d %d %d %d %F\n",
  2011               1, 2, 3, 4, 5, 6, 7, 8, ld);
  2012      vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  2013               "%l %l %f %f %F\n",
  2014               1, 2, 3, 4, 5, 6, 7, 8,
  2015               0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  2016               1234567891234LL, 987654321986LL,
  2017               42.0, 43.0, ld);
  2018      vprintf1("%d %d %d %d %d %d %d %d %f %f %f %f %f %f %f %f %f %f "
  2019               "%F %l %l %f %f %F\n",
  2020               1, 2, 3, 4, 5, 6, 7, 8,
  2021               0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0,
  2022               ld, 1234567891234LL, 987654321986LL,
  2023               42.0, 43.0, ld);
  2024  
  2025      bob.profile = 42;
  2026      stdarg_for_struct(bob, bob, bob, bob.profile);
  2027  }
  2028  
  2029  void whitespace_test(void)
  2030  {
  2031      char *str;
  2032  
  2033  
#if 1
  2034      pri\
  2035  ntf("whitspace:\n");
  2036  #endif
  2037      pf("N=%d\n", 2);
  2038  
  2039  #ifdef CORRECT_CR_HANDLING
  2040      pri\
  2041  ntf("aaa=%d\n", 3);
  2042  #endif
  2043  
  2044      pri\
  2045  \
  2046  ntf("min=%d\n", 4);
  2047  
  2048  #ifdef ACCEPT_CR_IN_STRINGS
  2049      printf("len1=%d\n", strlen("
  2050  "));
  2051  #ifdef CORRECT_CR_HANDLING
  2052      str = "
  2053  ";
  2054      printf("len1=%d str[0]=%d\n", strlen(str), str[0]);
  2055  #endif
  2056      printf("len1=%d\n", strlen("
a
  2057  "));
  2058  #endif /* ACCEPT_CR_IN_STRINGS */
  2059  }
  2060  
  2061  int reltab[3] = { 1, 2, 3 };
  2062  
  2063  int *rel1 = &reltab[1];
  2064  int *rel2 = &reltab[2];
  2065  
  2066  void relocation_test(void)
  2067  {
  2068      printf("*rel1=%d\n", *rel1);
  2069      printf("*rel2=%d\n", *rel2);
  2070  }
  2071  
  2072  void old_style_f(a,b,c)
  2073       int a, b;
  2074       double c;
  2075  {
  2076      printf("a=%d b=%d b=%f\n", a, b, c);
  2077  }
  2078  
  2079  void decl_func1(int cmpfn())
  2080  {
  2081      printf("cmpfn=%lx\n", (long)cmpfn);
  2082  }
  2083  
  2084  void decl_func2(cmpfn)
  2085  int cmpfn();
  2086  {
  2087      printf("cmpfn=%lx\n", (long)cmpfn);
  2088  }
  2089  
  2090  void old_style_function(void)
  2091  {
  2092      old_style_f((void *)1, 2, 3.0);
  2093      decl_func1(NULL);
  2094      decl_func2(NULL);
  2095  }
  2096  
  2097  void alloca_test()
  2098  {
  2099  #if defined __i386__ || defined __x86_64__
  2100      char *p = alloca(16);
  2101      strcpy(p,"123456789012345");
  2102      printf("alloca: p is %s\n", p);
  2103      char *demo = "This is only a test.\n";
  2104      /* Test alloca embedded in a larger expression */
  2105      printf("alloca: %s\n", strcpy(alloca(strlen(demo)+1),demo) );
  2106  #endif
  2107  }
  2108  
  2109  void *bounds_checking_is_enabled()
  2110  {
  2111      char ca[10], *cp = ca-1;
  2112      return (ca != cp + 1) ? cp : NULL;
  2113  }
  2114  
  2115  typedef int constant_negative_array_size_as_compile_time_assertion_idiom[(1 ? 2 : 0) - 1];
  2116  
  2117  void c99_vla_test(int size1, int size2)
  2118  {
  2119  #if defined __i386__ || defined __x86_64__
  2120      int size = size1 * size2;
  2121      int tab1[size][2], tab2[10][2];
  2122      void *tab1_ptr, *tab2_ptr, *bad_ptr;
  2123  
  2124      /* "size" should have been 'captured' at tab1 declaration, 
  2125          so modifying it should have no effect on VLA behaviour. */
  2126      size = size-1;
  2127      
  2128      printf("Test C99 VLA 1 (sizeof): ");
  2129      printf("%s\n", (sizeof tab1 == size1 * size2 * 2 * sizeof(int)) ? "PASSED" : "FAILED");
  2130      tab1_ptr = tab1;
  2131      tab2_ptr = tab2;
  2132      printf("Test C99 VLA 2 (ptrs substract): ");
  2133      printf("%s\n", (tab2 - tab1 == (tab2_ptr - tab1_ptr) / (sizeof(int) * 2)) ? "PASSED" : "FAILED");
  2134      printf("Test C99 VLA 3 (ptr add): ");
  2135      printf("%s\n", &tab1[5][1] == (tab1_ptr + (5 * 2 + 1) * sizeof(int)) ? "PASSED" : "FAILED");
  2136      printf("Test C99 VLA 4 (ptr access): ");
  2137      tab1[size1][1] = 42;
  2138      printf("%s\n", (*((int *) (tab1_ptr + (size1 * 2 + 1) * sizeof(int))) == 42) ? "PASSED" : "FAILED");
  2139  
  2140      printf("Test C99 VLA 5 (bounds checking (might be disabled)): ");
  2141      if (bad_ptr = bounds_checking_is_enabled()) {
  2142          int *t1 = &tab1[size1 * size2 - 1][3];
  2143          int *t2 = &tab2[9][3];
  2144          printf("%s ", bad_ptr == t1 ? "PASSED" : "FAILED");
  2145          printf("%s ", bad_ptr == t2 ? "PASSED" : "FAILED");
  2146  
  2147          char*c1 = 1 + sizeof(tab1) + (char*)tab1;
  2148          char*c2 = 1 + sizeof(tab2) + (char*)tab2;
  2149          printf("%s ", bad_ptr == c1 ? "PASSED" : "FAILED");
  2150          printf("%s ", bad_ptr == c2 ? "PASSED" : "FAILED");
  2151  
  2152          int *i1 = tab1[-1];
  2153          int *i2 = tab2[-1];
  2154          printf("%s ", bad_ptr == i1 ? "PASSED" : "FAILED");
  2155          printf("%s ", bad_ptr == i2 ? "PASSED" : "FAILED");
  2156  
  2157          int *x1 = tab1[size1 * size2 + 1];
  2158          int *x2 = tab2[10 + 1];
  2159          printf("%s ", bad_ptr == x1 ? "PASSED" : "FAILED");
  2160          printf("%s ", bad_ptr == x2 ? "PASSED" : "FAILED");
  2161      } else {
  2162          printf("PASSED PASSED PASSED PASSED PASSED PASSED PASSED PASSED ");
  2163      }
  2164      printf("\n");
  2165  #endif
  2166  }
  2167  
  2168  typedef __SIZE_TYPE__ uintptr_t;
  2169  
  2170  void sizeof_test(void)
  2171  {
  2172      int a;
  2173      int **ptr;
  2174  
  2175      printf("sizeof(int) = %d\n", sizeof(int));
  2176      printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
  2177      printf("sizeof(long) = %d\n", sizeof(long));
  2178      printf("sizeof(unsigned long) = %d\n", sizeof(unsigned long));
  2179      printf("sizeof(short) = %d\n", sizeof(short));
  2180      printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short));
  2181      printf("sizeof(char) = %d\n", sizeof(char));
  2182      printf("sizeof(unsigned char) = %d\n", sizeof(unsigned char));
  2183      printf("sizeof(func) = %d\n", sizeof sizeof_test());
  2184      a = 1;
  2185      printf("sizeof(a++) = %d\n", sizeof a++);
  2186      printf("a=%d\n", a);
  2187      ptr = NULL;
  2188      printf("sizeof(**ptr) = %d\n", sizeof (**ptr));
  2189  
  2190      /* The type of sizeof should be as large as a pointer, actually
  2191         it should be size_t.  */
  2192      printf("sizeof(sizeof(int) = %d\n", sizeof(sizeof(int)));
  2193      uintptr_t t = 1;
  2194      uintptr_t t2;
  2195      /* Effectively <<32, but defined also on 32bit machines.  */
  2196      t <<= 16;
  2197      t <<= 16;
  2198      t++;
  2199      /* This checks that sizeof really can be used to manipulate 
  2200         uintptr_t objects, without truncation.  */
  2201      t2 = t & -sizeof(uintptr_t);
  2202      printf ("%lu %lu\n", t, t2);
  2203  
  2204      /* some alignof tests */
  2205      printf("__alignof__(int) = %d\n", __alignof__(int));
  2206      printf("__alignof__(unsigned int) = %d\n", __alignof__(unsigned int));
  2207      printf("__alignof__(short) = %d\n", __alignof__(short));
  2208      printf("__alignof__(unsigned short) = %d\n", __alignof__(unsigned short));
  2209      printf("__alignof__(char) = %d\n", __alignof__(char));
  2210      printf("__alignof__(unsigned char) = %d\n", __alignof__(unsigned char));
  2211      printf("__alignof__(func) = %d\n", __alignof__ sizeof_test());
  2212  }
  2213  
  2214  void typeof_test(void)
  2215  {
  2216      double a;
  2217      typeof(a) b;
  2218      typeof(float) c;
  2219  
  2220      a = 1.5;
  2221      b = 2.5;
  2222      c = 3.5;
  2223      printf("a=%f b=%f c=%f\n", a, b, c);
  2224  }
  2225  
  2226  void statement_expr_test(void)
  2227  {
  2228      int a, i;
  2229  
  2230      a = 0;
  2231      for(i=0;i<10;i++) {
  2232          a += 1 + 
  2233              ( { int b, j; 
  2234                  b = 0; 
  2235                  for(j=0;j<5;j++) 
  2236                      b += j; b; 
  2237              } );
  2238      }
  2239      printf("a=%d\n", a);
  2240      
  2241  }
  2242  
  2243  void local_label_test(void)
  2244  {
  2245      int a;
  2246      goto l1;
  2247   l2:
  2248      a = 1 + ({
  2249          __label__ l1, l2, l3, l4;
  2250          goto l1;
  2251      l4:
  2252          printf("aa1\n");
  2253          goto l3;
  2254      l2:
  2255          printf("aa3\n");
  2256          goto l4;
  2257      l1:
  2258          printf("aa2\n");
  2259          goto l2;
  2260      l3:;
  2261          1;
  2262      });
  2263      printf("a=%d\n", a);
  2264      return;
  2265   l4:
  2266      printf("bb1\n");
  2267      goto l2;
  2268   l1:
  2269      printf("bb2\n");
  2270      goto l4;
  2271  }
  2272  
  2273  /* inline assembler test */
  2274  #ifdef __i386__
  2275  
  2276  /* from linux kernel */
  2277  static char * strncat1(char * dest,const char * src,size_t count)
  2278  {
  2279  int d0, d1, d2, d3;
  2280  __asm__ __volatile__(
  2281  	"repne\n\t"
  2282  	"scasb\n\t"
  2283  	"decl %1\n\t"
  2284  	"movl %8,%3\n"
  2285  	"1:\tdecl %3\n\t"
  2286  	"js 2f\n\t"
  2287  	"lodsb\n\t"
  2288  	"stosb\n\t"
  2289  	"testb %%al,%%al\n\t"
  2290  	"jne 1b\n"
  2291  	"2:\txorl %2,%2\n\t"
  2292  	"stosb"
  2293  	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
  2294  	: "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
  2295  	: "memory");
  2296  return dest;
  2297  }
  2298  
  2299  static char * strncat2(char * dest,const char * src,size_t count)
  2300  {
  2301  int d0, d1, d2, d3;
  2302  __asm__ __volatile__(
  2303  	"repne scasb\n\t" /* one-line repne prefix + string op */
  2304  	"decl %1\n\t"
  2305  	"movl %8,%3\n"
  2306  	"1:\tdecl %3\n\t"
  2307  	"js 2f\n\t"
  2308  	"lodsb\n\t"
  2309  	"stosb\n\t"
  2310  	"testb %%al,%%al\n\t"
  2311  	"jne 1b\n"
  2312  	"2:\txorl %2,%2\n\t"
  2313  	"stosb"
  2314  	: "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
  2315  	: "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
  2316  	: "memory");
  2317  return dest;
  2318  }
  2319  
  2320  static inline void * memcpy1(void * to, const void * from, size_t n)
  2321  {
  2322  int d0, d1, d2;
  2323  __asm__ __volatile__(
  2324  	"rep ; movsl\n\t"
  2325  	"testb $2,%b4\n\t"
  2326  	"je 1f\n\t"
  2327  	"movsw\n"
  2328  	"1:\ttestb $1,%b4\n\t"
  2329  	"je 2f\n\t"
  2330  	"movsb\n"
  2331  	"2:"
  2332  	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
  2333  	:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
  2334  	: "memory");
  2335  return (to);
  2336  }
  2337  
  2338  static inline void * memcpy2(void * to, const void * from, size_t n)
  2339  {
  2340  int d0, d1, d2;
  2341  __asm__ __volatile__(
  2342  	"rep movsl\n\t"  /* one-line rep prefix + string op */
  2343  	"testb $2,%b4\n\t"
  2344  	"je 1f\n\t"
  2345  	"movsw\n"
  2346  	"1:\ttestb $1,%b4\n\t"
  2347  	"je 2f\n\t"
  2348  	"movsb\n"
  2349  	"2:"
  2350  	: "=&c" (d0), "=&D" (d1), "=&S" (d2)
  2351  	:"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
  2352  	: "memory");
  2353  return (to);
  2354  }
  2355  
  2356  static __inline__ void sigaddset1(unsigned int *set, int _sig)
  2357  {
  2358  	__asm__("btsl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
  2359  }
  2360  
  2361  static __inline__ void sigdelset1(unsigned int *set, int _sig)
  2362  {
  2363  	asm("btrl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
  2364  }
  2365  
  2366  static __inline__ __const__ unsigned int swab32(unsigned int x)
  2367  {
  2368  	__asm__("xchgb %b0,%h0\n\t"	/* swap lower bytes	*/
  2369  		"rorl $16,%0\n\t"	/* swap words		*/
  2370  		"xchgb %b0,%h0"		/* swap higher bytes	*/
  2371  		:"=q" (x)
  2372  		: "0" (x));
  2373  	return x;
  2374  }
  2375  
  2376  static __inline__ unsigned long long mul64(unsigned int a, unsigned int b)
  2377  {
  2378      unsigned long long res;
  2379      __asm__("mull %2" : "=A" (res) : "a" (a), "r" (b));
  2380      return res;
  2381  }
  2382  
  2383  static __inline__ unsigned long long inc64(unsigned long long a)
  2384  {
  2385      unsigned long long res;
  2386      __asm__("addl $1, %%eax ; adcl $0, %%edx" : "=A" (res) : "A" (a));
  2387      return res;
  2388  }
  2389  
  2390  unsigned int set;
  2391  
  2392  void asm_test(void)
  2393  {
  2394      char buf[128];
  2395      unsigned int val;
  2396  
  2397      printf("inline asm:\n");
  2398      /* test the no operand case */
  2399      asm volatile ("xorl %eax, %eax");
  2400  
  2401      memcpy1(buf, "hello", 6);
  2402      strncat1(buf, " worldXXXXX", 3);
  2403      printf("%s\n", buf);
  2404  
  2405      memcpy2(buf, "hello", 6);
  2406      strncat2(buf, " worldXXXXX", 3);
  2407      printf("%s\n", buf);
  2408  
  2409      /* 'A' constraint test */
  2410      printf("mul64=0x%Lx\n", mul64(0x12345678, 0xabcd1234));
  2411      printf("inc64=0x%Lx\n", inc64(0x12345678ffffffff));
  2412  
  2413      set = 0xff;
  2414      sigdelset1(&set, 2);
  2415      sigaddset1(&set, 16);
  2416      /* NOTE: we test here if C labels are correctly restored after the
  2417         asm statement */
  2418      goto label1;
  2419   label2:
  2420      __asm__("btsl %1,%0" : "=m"(set) : "Ir"(20) : "cc");
  2421  #ifdef __GNUC__ // works strange with GCC 4.3
  2422      set=0x1080fd;
  2423  #endif
  2424      printf("set=0x%x\n", set);
  2425      val = 0x01020304;
  2426      printf("swab32(0x%08x) = 0x%0x\n", val, swab32(val));
  2427      return;
  2428   label1:
  2429      goto label2;
  2430  }
  2431  
  2432  #else
  2433  
  2434  void asm_test(void)
  2435  {
  2436  }
  2437  
  2438  #endif
  2439  
  2440  #define COMPAT_TYPE(type1, type2) \
  2441  {\
  2442      printf("__builtin_types_compatible_p(%s, %s) = %d\n", #type1, #type2, \
  2443             __builtin_types_compatible_p (type1, type2));\
  2444  }
  2445  
  2446  int constant_p_var;
  2447  
  2448  void builtin_test(void)
  2449  {
  2450  #if GCC_MAJOR >= 3
  2451      COMPAT_TYPE(int, int);
  2452      COMPAT_TYPE(int, unsigned int);
  2453      COMPAT_TYPE(int, char);
  2454      COMPAT_TYPE(int, const int);
  2455      COMPAT_TYPE(int, volatile int);
  2456      COMPAT_TYPE(int *, int *);
  2457      COMPAT_TYPE(int *, void *);
  2458      COMPAT_TYPE(int *, const int *);
  2459      COMPAT_TYPE(char *, unsigned char *);
  2460  /* space is needed because tcc preprocessor introduces a space between each token */
  2461      COMPAT_TYPE(char * *, void *); 
  2462  #endif
  2463      printf("res = %d\n", __builtin_constant_p(1));
  2464      printf("res = %d\n", __builtin_constant_p(1 + 2));
  2465      printf("res = %d\n", __builtin_constant_p(&constant_p_var));
  2466      printf("res = %d\n", __builtin_constant_p(constant_p_var));
  2467  }
  2468  
  2469  #ifndef _WIN32
  2470  extern int __attribute__((weak)) weak_f1(void);
  2471  extern int __attribute__((weak)) weak_f2(void);
  2472  extern int                       weak_f3(void);
  2473  extern int __attribute__((weak)) weak_v1;
  2474  extern int __attribute__((weak)) weak_v2;
  2475  extern int                       weak_v3;
  2476  
  2477  extern int                           (*weak_fpa)() __attribute__((weak));
  2478  extern int __attribute__((weak))     (*weak_fpb)();
  2479  extern     __attribute__((weak)) int (*weak_fpc)();
  2480  
  2481  extern int                     weak_asm_f1(void) asm("weak_asm_f1x") __attribute((weak));
  2482  extern int __attribute((weak)) weak_asm_f2(void) asm("weak_asm_f2x")                    ;
  2483  extern int __attribute((weak)) weak_asm_f3(void) asm("weak_asm_f3x") __attribute((weak));
  2484  extern int                     weak_asm_v1       asm("weak_asm_v1x") __attribute((weak));
  2485  extern int __attribute((weak)) weak_asm_v2       asm("weak_asm_v2x")                    ;
  2486  extern int __attribute((weak)) weak_asm_v3(void) asm("weak_asm_v3x") __attribute((weak));
  2487  
  2488  static const size_t dummy = 0;
  2489  extern __typeof(dummy) weak_dummy1 __attribute__((weak, alias("dummy")));
  2490  extern __typeof(dummy) __attribute__((weak, alias("dummy"))) weak_dummy2;
  2491  extern __attribute__((weak, alias("dummy"))) __typeof(dummy) weak_dummy3;
  2492  
  2493  int some_lib_func(void);
  2494  int dummy_impl_of_slf(void) { return 444; }
  2495  int some_lib_func(void) __attribute__((weak, alias("dummy_impl_of_slf")));
  2496  
  2497  int weak_toolate() __attribute__((weak));
  2498  int weak_toolate() { return 0; }
  2499  
  2500  void __attribute__((weak)) weak_test(void)
  2501  {
  2502  	printf("weak_f1=%d\n", weak_f1 ? weak_f1() : 123);
  2503  	printf("weak_f2=%d\n", weak_f2 ? weak_f2() : 123);
  2504  	printf("weak_f3=%d\n", weak_f3 ? weak_f3() : 123);
  2505  	printf("weak_v1=%d\n",&weak_v1 ? weak_v1   : 123);
  2506  	printf("weak_v2=%d\n",&weak_v2 ? weak_v2   : 123);
  2507  	printf("weak_v3=%d\n",&weak_v3 ? weak_v3   : 123);
  2508  
  2509  	printf("weak_fpa=%d\n",&weak_fpa ? weak_fpa() : 123);
  2510  	printf("weak_fpb=%d\n",&weak_fpb ? weak_fpb() : 123);
  2511  	printf("weak_fpc=%d\n",&weak_fpc ? weak_fpc() : 123);
  2512  	
  2513  	printf("weak_asm_f1=%d\n", weak_asm_f1 != NULL);
  2514  	printf("weak_asm_f2=%d\n", weak_asm_f2 != NULL);
  2515  	printf("weak_asm_f3=%d\n", weak_asm_f3 != NULL);
  2516  	printf("weak_asm_v1=%d\n",&weak_asm_v1 != NULL);
  2517  	printf("weak_asm_v2=%d\n",&weak_asm_v2 != NULL);
  2518  	printf("weak_asm_v3=%d\n",&weak_asm_v3 != NULL);
  2519  }
  2520  
  2521  int __attribute__((weak)) weak_f2() { return 222; }
  2522  int __attribute__((weak)) weak_f3() { return 333; }
  2523  int __attribute__((weak)) weak_v2 = 222;
  2524  int __attribute__((weak)) weak_v3 = 333;
  2525  #endif
  2526  
  2527  void const_func(const int a)
  2528  {
  2529  }
  2530  
  2531  void const_warn_test(void)
  2532  {
  2533      const_func(1);
  2534  }
  2535  
  2536  struct condstruct {
  2537    int i;
  2538  };
  2539  
  2540  int getme (struct condstruct *s, int i)
  2541  {
  2542    int i1 = (i == 0 ? 0 : s)->i;
  2543    int i2 = (i == 0 ? s : 0)->i;
  2544    int i3 = (i == 0 ? (void*)0 : s)->i;
  2545    int i4 = (i == 0 ? s : (void*)0)->i;
  2546    return i1 + i2 + i3 + i4;
  2547  }
  2548  
  2549  struct global_data
  2550  {
  2551    int a[40];
  2552    int *b[40];
  2553  };
  2554  
  2555  struct global_data global_data;
  2556  
  2557  int global_data_getstuff (int *, int);
  2558  
  2559  void global_data_callit (int i)
  2560  {
  2561    *global_data.b[i] = global_data_getstuff (global_data.b[i], 1);
  2562  }
  2563  
  2564  int global_data_getstuff (int *p, int i)
  2565  {
  2566    return *p + i;
  2567  }
  2568  
  2569  void global_data_test (void)
  2570  {
  2571    global_data.a[0] = 42;
  2572    global_data.b[0] = &global_data.a[0];
  2573    global_data_callit (0);
  2574    printf ("%d\n", global_data.a[0]);
  2575  }
  2576  
  2577  struct cmpcmpS
  2578  {
  2579    unsigned char fill : 3;
  2580    unsigned char b1 : 1;
  2581    unsigned char b2 : 1;
  2582    unsigned char fill2 : 3;
  2583  };
  2584  
  2585  int glob1, glob2, glob3;
  2586  
  2587  void compare_comparisons (struct cmpcmpS *s)
  2588  {
  2589    if (s->b1 != (glob1 == glob2)
  2590        || (s->b2 != (glob1 == glob3)))
  2591      printf ("comparing comparisons broken\n");
  2592  }
  2593  
  2594  void cmp_comparison_test(void)
  2595  {
  2596    struct cmpcmpS s;
  2597    s.b1 = 1;
  2598    glob1 = 42; glob2 = 42;
  2599    s.b2 = 0;
  2600    glob3 = 43;
  2601    compare_comparisons (&s);
  2602  }
  2603  
  2604  int fcompare (double a, double b, int code)
  2605  {
  2606    switch (code) {
  2607      case 0: return a == b;
  2608      case 1: return a != b;
  2609      case 2: return a < b;
  2610      case 3: return a >= b;
  2611      case 4: return a > b;
  2612      case 5: return a <= b;
  2613    }
  2614  }
  2615  
  2616  void math_cmp_test(void)
  2617  {
  2618    double nan = 0.0/0.0;
  2619    double one = 1.0;
  2620    double two = 2.0;
  2621    int comp = 0;
  2622  #define bug(a,b,op,iop,part) printf("Test broken: %s %s %s %s %d\n", #a, #b, #op, #iop, part)
  2623  
  2624    /* This asserts that "a op b" is _not_ true, but "a iop b" is true.
  2625       And it does this in various ways so that all code generation paths
  2626       are checked (generating inverted tests, or non-inverted tests, or
  2627       producing a 0/1 value without jumps (that's done in the fcompare
  2628       function).  */
  2629  #define FCMP(a,b,op,iop,code) \
  2630    if (fcompare (a,b,code))    \
  2631      bug (a,b,op,iop,1); \
  2632    if (a op b) \
  2633      bug (a,b,op,iop,2); \
  2634    if (a iop b) \
  2635      ; \
  2636    else \
  2637      bug (a,b,op,iop,3); \
  2638    if ((a op b) || comp) \
  2639      bug (a,b,op,iop,4); \
  2640    if ((a iop b) || comp) \
  2641      ; \
  2642    else \
  2643      bug (a,b,op,iop,5);
  2644  
  2645    /* Equality tests.  */
  2646    FCMP(nan, nan, ==, !=, 0);
  2647    FCMP(one, two, ==, !=, 0);
  2648    FCMP(one, one, !=, ==, 1);
  2649    /* Non-equality is a bit special.  */
  2650    if (!fcompare (nan, nan, 1))
  2651      bug (nan, nan, !=, ==, 6);
  2652  
  2653    /* Relational tests on numbers.  */
  2654    FCMP(two, one, <, >=, 2);
  2655    FCMP(one, two, >=, <, 3);
  2656    FCMP(one, two, >, <=, 4);
  2657    FCMP(two, one, <=, >, 5);
  2658  
  2659    /* Relational tests on NaNs.  Note that the inverse op here is
  2660       always !=, there's no operator in C that is equivalent to !(a < b),
  2661       when NaNs are involved, same for the other relational ops.  */
  2662    FCMP(nan, nan, <, !=, 2);
  2663    FCMP(nan, nan, >=, !=, 3);
  2664    FCMP(nan, nan, >, !=, 4);
  2665    FCMP(nan, nan, <=, !=, 5);
  2666  }
  2667  
  2668  double get100 () { return 100.0; }
  2669  
  2670  void callsave_test(void)
  2671  {
  2672  #if defined __i386__ || defined __x86_64__
  2673    int i, s; double *d; double t;
  2674    s = sizeof (double);
  2675    printf ("callsavetest: %d\n", s);
  2676    d = alloca (sizeof(double));
  2677    d[0] = 10.0;
  2678    /* x86-64 had a bug were the next call to get100 would evict
  2679       the lvalue &d[0] as VT_LLOCAL, and the reload would be done
  2680       in int type, not pointer type.  When alloca returns a pointer
  2681       with the high 32 bit set (which is likely on x86-64) the access
  2682       generates a segfault.  */
  2683    i = d[0] > get100 ();
  2684    printf ("%d\n", i);
  2685  #endif
  2686  }
  2687  
  2688  
  2689  void bfa3(ptrdiff_t str_offset)
  2690  {
  2691      printf("bfa3: %s\n", (char *)__builtin_frame_address(3) + str_offset);
  2692  }
  2693  void bfa2(ptrdiff_t str_offset)
  2694  {
  2695      printf("bfa2: %s\n", (char *)__builtin_frame_address(2) + str_offset);
  2696      bfa3(str_offset);
  2697  }
  2698  void bfa1(ptrdiff_t str_offset)
  2699  {
  2700      printf("bfa1: %s\n", (char *)__builtin_frame_address(1) + str_offset);
  2701  #if defined(__arm__) && !defined(__GNUC__)
  2702      bfa2(str_offset);
  2703  #endif
  2704  }
  2705  
  2706  void builtin_frame_address_test(void)
  2707  {
  2708      char str[] = "__builtin_frame_address";
  2709      char *fp0 = __builtin_frame_address(0);
  2710  
  2711      printf("str: %s\n", str);
  2712      bfa1(str-fp0);
  2713  }