1  /* { dg-do run { target pthread_h } } */
       2  /* { dg-skip-if "no pthread_barrier" { *-*-darwin* } } */
       3  /* { dg-shouldfail "asan" } */
       4  /* { dg-set-target-env-var ASAN_OPTIONS "detect_invalid_pointer_pairs=2:halt_on_error=1" } */
       5  /* { dg-options "-fsanitize=address,pointer-subtract" } */
       6  /* { dg-additional-options "-pthread" { target pthread } } */
       7  
       8  #include <unistd.h>
       9  #include <pthread.h>
      10  
      11  char *pointer;
      12  pthread_barrier_t bar;
      13  
      14  void *
      15  thread_main (void *n)
      16  {
      17    char local;
      18    (void) n;
      19    pointer = &local;
      20    pthread_barrier_wait (&bar);
      21    pthread_barrier_wait (&bar);
      22  
      23    return 0;
      24  }
      25  
      26  int
      27  main ()
      28  {
      29    pthread_t thread;
      30    pthread_barrier_init (&bar, NULL, 2);
      31    pthread_create (&thread, NULL, thread_main, NULL);
      32    pthread_barrier_wait (&bar);
      33  
      34    char local;
      35    char *parent_pointer = &local;
      36  
      37    /* { dg-output "ERROR: AddressSanitizer: invalid-pointer-pair" } */
      38    volatile __PTRDIFF_TYPE__ r = parent_pointer - pointer;
      39    pthread_barrier_wait (&bar);
      40    pthread_join (thread, NULL);
      41    pthread_barrier_destroy (&bar);
      42  
      43    return 0;
      44  }