1  /* { dg-do run } */
       2  /* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */
       3  /* { dg-options "-fsanitize=undefined" } */
       4  
       5  static char a[128] __attribute__ ((aligned(4096)));
       6  static int b[128] __attribute__ ((aligned(4096)));
       7  
       8  __attribute__ ((noinline, noclone)) int
       9  fn1 (int i)
      10  {
      11    asm ("");
      12    return a[i & 127];
      13  }
      14  
      15  __attribute__ ((noinline, noclone)) int
      16  fn2 (int i)
      17  {
      18    asm ("");
      19    return a[i & 128];
      20  }
      21  
      22  /* { dg-output "index 128 out of bounds for type 'char \\\[128\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
      23  /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" } */
      24  /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
      25  /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
      26  /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
      27  
      28  __attribute__ ((noinline, noclone)) int
      29  fn3 (int i)
      30  {
      31    asm ("");
      32    return b[i & 127];
      33  }
      34  
      35  __attribute__ ((noinline, noclone)) int
      36  fn4 (int i)
      37  {
      38    asm ("");
      39    return b[i & 128];
      40  }
      41  
      42  /* { dg-output "\[^\n\r]*index 128 out of bounds for type 'int \\\[128\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
      43  /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'int'\[^\n\r]*(\n|\r\n|\r)" } */
      44  /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
      45  /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
      46  /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
      47  
      48  __attribute__ ((noinline, noclone)) int
      49  fn5 (int i, int j)
      50  {
      51    asm ("");
      52    return b[i & j];
      53  }
      54  
      55  /* { dg-output "\[^\n\r]*index 128 out of bounds for type 'int \\\[128\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
      56  /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'int'\[^\n\r]*(\n|\r\n|\r)" } */
      57  /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
      58  /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
      59  /* { dg-output "\[^\n\r]*\\^" } */
      60  
      61  __attribute__ ((noinline, noclone)) int
      62  fn6 (int i)
      63  {
      64    asm ("");
      65    return b[i & 0];
      66  }
      67  
      68  int
      69  main (void)
      70  {
      71    fn1 (128);
      72    fn2 (128);
      73    fn3 (128);
      74    fn4 (128);
      75    fn5 (128, 127);
      76    fn5 (128, 128);
      77    fn6 (128);
      78    return 0;
      79  }