1  /* { dg-do run } */
       2  /* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */
       3  /* { dg-options "-fsanitize=undefined" } */
       4  #include <stdio.h>
       5  
       6  int
       7  __attribute__ ((noinline))
       8  dyn (int size, int i)
       9  {
      10    __builtin_printf ("dyn\n");
      11    fflush (stdout);
      12    int *alloc = __builtin_calloc (size, sizeof (int));
      13    int ret = alloc[i];
      14    __builtin_free (alloc);
      15    return ret;
      16  }
      17  
      18  int
      19  __attribute__ ((noinline))
      20  off (int size, int i, int ret)
      21  {
      22    char *mem = __builtin_alloca (size);
      23    mem += size - 1;
      24  
      25    return (int) mem[i] & ret;
      26  }
      27  
      28  int
      29  main (void)
      30  {
      31    int ret = dyn (2, 2);
      32  
      33    ret |= off (4, 4, 0);
      34  
      35    return ret;
      36  }
      37  
      38  /* { dg-output "load of address \[^\n\r]* with insufficient space for an object of type 'int'\[^\n\r]*(\n|\r\n|\r)" } */
      39  /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
      40  /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
      41  /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
      42  /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" } */
      43  /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
      44  /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
      45  /* { dg-output "\[^\n\r]*\\^" } */