modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/compile/pr83510.c (about)

     1  /* Various examples of safe array access for which -Warray-bounds
     2     shouldn't issue a warning at any optimization level
     3     (PR tree-optimization/83510).  */
     4  
     5  /* { dg-options "-Warray-bounds" } */
     6  
     7  extern int get_flag (void);
     8  
     9  unsigned int arr[10];
    10  
    11  struct xyz {
    12    unsigned int a0;
    13  };
    14  
    15  extern void wfm(struct xyz *, int, unsigned int);
    16  
    17  static unsigned int f(struct xyz * ctx, unsigned int number)
    18  {
    19    switch (number) {
    20    case 0x9:
    21      return ctx->a0;
    22    case 0xA: case 0xB:
    23    case 0xC: case 0xD: case 0xE: case 0xF:
    24    case 0x10: case 0x11: case 0x12: case 0x13:
    25      return arr[number - 0xa];
    26    }
    27    return 0;
    28  }
    29  
    30  int g(struct xyz * ctx) {
    31    int i;
    32  
    33    for (i = 0; i < 10; i++) {
    34      wfm(ctx, i, f(ctx, i));
    35    }
    36  
    37    return 0;
    38  }
    39  
    40  static unsigned int f_signed(struct xyz * ctx, int number)
    41  {
    42    switch (number) {
    43    case 0x9:
    44      return ctx->a0;
    45    case 0xA: case 0xB:
    46    case 0xC: case 0xD: case 0xE: case 0xF:
    47    case 0x10: case 0x11: case 0x12: case 0x13:
    48      return arr[number];
    49    }
    50    return 0;
    51  }
    52  
    53  int g_signed(struct xyz * ctx) {
    54    int i;
    55  
    56    for (i = 0; i < 10; i++) {
    57      wfm(ctx, i, f(ctx, i));
    58    }
    59  
    60    return 0;
    61  }
    62  
    63  void test_2 (struct xyz * ctx)
    64  {
    65    int i;
    66  
    67    for (i = 0; i < 10; i++) {
    68      if (get_flag ())
    69        wfm(ctx, i, f(ctx, i));
    70    }
    71  }
    72  
    73  void test_2_signed (struct xyz * ctx)
    74  {
    75    int i;
    76  
    77    for (i = 0; i < 10; i++) {
    78      if (get_flag ())
    79        wfm(ctx, i, f_signed(ctx, i));
    80    }
    81  }
    82  
    83  void test_3 (struct xyz * ctx)
    84  {
    85    unsigned int i;
    86    
    87    for (i = 0; i < 10; i++) {
    88      switch (i) {
    89      case 0x9:
    90        wfm(ctx, i, ctx->a0);
    91        break;
    92      case 0xA: case 0xB:
    93      case 0xC: case 0xD: case 0xE: case 0xF:
    94      case 0x10: case 0x11: case 0x12: case 0x13:
    95        if (get_flag ())
    96  	wfm(ctx, i, arr[i - 0xa]);
    97        break;
    98      }
    99    }
   100  }
   101  
   102  void test_3_signed (struct xyz * ctx)
   103  {
   104    int i;
   105    
   106    for (i = 0; i < 10; i++) {
   107      switch (i) {
   108      case 0x9:
   109        wfm(ctx, i, ctx->a0);
   110        break;
   111      case 0xA: case 0xB:
   112      case 0xC: case 0xD: case 0xE: case 0xF:
   113      case 0x10: case 0x11: case 0x12: case 0x13:
   114        if (get_flag ())
   115  	wfm(ctx, i, arr[i]);
   116        break;
   117      }
   118    }
   119  }
   120  
   121  void test_4 (struct xyz * ctx)
   122  {
   123    unsigned int i, j;
   124    
   125    for (i = 0; i < 10; i++) {
   126      switch (i) {
   127      case 0x9:
   128        wfm(ctx, i, ctx->a0);
   129        break;
   130      case 0xA: case 0xB:
   131      case 0xC: case 0xD: case 0xE: case 0xF:
   132      case 0x10: case 0x11: case 0x12: case 0x13:
   133        for (j = 0; j < 5; j++)
   134  	wfm(ctx, i, arr[i - 0xa]);
   135        break;
   136      }
   137    }
   138  }
   139  void test_4_signed (struct xyz * ctx)
   140  {
   141    int i, j;
   142    
   143    for (i = 0; i < 10; i++) {
   144      switch (i) {
   145      case 0x9:
   146        wfm(ctx, i, ctx->a0);
   147        break;
   148      case 0xA: case 0xB:
   149      case 0xC: case 0xD: case 0xE: case 0xF:
   150      case 0x10: case 0x11: case 0x12: case 0x13:
   151        for (j = 0; j < 5; j++)
   152  	wfm(ctx, i, arr[i]);
   153        break;
   154      }
   155    }
   156  }
   157  
   158  void test_5 (struct xyz * ctx)
   159  {
   160    unsigned int i;
   161    for (i = 10; i < 20; i++) {
   162      wfm(ctx, i, arr[i - 10]);
   163    }    
   164  }
   165  
   166  void test_5_signed (struct xyz * ctx)
   167  {
   168    int i;
   169    for (i = 10; i < 20; i++) {
   170      wfm(ctx, i, arr[i - 10]);
   171    }    
   172  }