1  /* { dg-options "-O -fsanitize=pointer-overflow -fdump-tree-optimized" } */
       2  /* { dg-skip-if "" { *-*-* } "-flto" } */
       3  
       4  #define SMAX   __PTRDIFF_MAX__
       5  
       6  void foo(void)
       7  {
       8    char *p;
       9    char *p2;
      10    char b[1];
      11    char c[1];
      12  
      13    p = b + SMAX; /* pointer overflow check is needed */
      14    p = b;
      15    p++;
      16    p2 = p + 1000;
      17    p2 = p + 999;
      18  
      19    p = b + SMAX;
      20    p2 = p + 1; /* pointer overflow check is needed */
      21  
      22    p = b;
      23    p--; /* pointer overflow check is needed */
      24    p2 = p + 1;
      25    p2 = p + 2;
      26  
      27    p = b - SMAX; /* pointer overflow check is needed */
      28    p2 = p + (SMAX - 2); /* b - 2: no need to check this  */
      29    p2 = p + (SMAX - 1); /* b - 1: no need to check this */
      30    p2 = p + SMAX; /* b: no need to check this */
      31    p2++; /* b + 1 */
      32  
      33    p = c;
      34    p++; /* c + 1 */
      35    p = c - SMAX; /* pointer overflow check is needed */
      36    p2 = p + SMAX; /* c: pointer overflow check is needed */
      37    p2++; /* c + 1 */
      38  }
      39  
      40  void bar(char *ptr)
      41  {
      42    char *p = ptr - 1000; /* pointer overflow check is needed */
      43    p = ptr + 1000; /* pointer overflow check is needed */
      44    p -= 2000; /* pointer overflow check is needed */
      45  }
      46  
      47  void baz(char *ptr)
      48  {
      49    char **p = &ptr;
      50    char **p2 = p + 20; /* pointer overflow check is needed */
      51    p2--;
      52  }
      53  
      54  void positive_and_positive (char *ptr)
      55  {
      56    char **p = &ptr;
      57    char **p2 = p + 100; /* pointer overflow check is needed */
      58    p2 = p + 10;
      59    p += 50; 
      60  }
      61  
      62  void negative_to_positive (char *ptr)
      63  {
      64    char **p = &ptr;
      65    char **p2 = p + 20; /* pointer overflow check is needed */
      66    p2 = p - 10; /* pointer overflow check is needed */
      67    p2 += 15;
      68  }
      69  
      70  void negative_to_negative (char *ptr)
      71  {
      72    char **p = &ptr;
      73    char **p2 = p - 20; /* pointer overflow check is needed */
      74    p2 = p - 20;
      75    p2 += 5;
      76  }
      77  
      78  /* { dg-final { scan-tree-dump-times "__ubsan_handle_pointer_overflow" 14 "optimized" } } */