1  /* { dg-do run }  */
       2  /* { dg-require-effective-target tls  }  */
       3  /* { dg-require-effective-target pthread } */
       4  /* { dg-options "-pthread" } */
       5  
       6  #include <pthread.h>
       7  extern int printf (char *,...);
       8  __thread int a = 5; 
       9  int *volatile a_in_other_thread = (int *) 12345;
      10  
      11  static void *
      12  thread_func (void *arg)
      13  {
      14    a_in_other_thread = &a;
      15    a+=5;
      16    *((int *) arg) = a;
      17    return (void *)0;
      18  }
      19  
      20  int
      21  main ()
      22  {
      23    pthread_t thread;
      24    void *thread_retval;
      25    int *volatile a_in_main_thread;
      26    int *volatile again ;
      27    int thr_a;
      28  
      29    a_in_main_thread = &a;
      30  
      31    if (pthread_create (&thread, (pthread_attr_t *)0, thread_func, &thr_a))
      32      return 0;
      33  
      34    if (pthread_join (thread, &thread_retval))
      35      return 0;
      36  
      37    again = &a;
      38    if (again != a_in_main_thread)
      39      {
      40        printf ("FAIL: main thread addy changed from 0x%0x to 0x%0x\n", 
      41  		a_in_other_thread, again);
      42        return 1;
      43      }
      44  
      45    if (a != 5 || thr_a != 10 || (a_in_other_thread == a_in_main_thread))
      46      {
      47        printf ("FAIL: a= %d, thr_a = %d Addr = 0x%0x\n", 
      48  		a, thr_a, a_in_other_thread);
      49        return 1;
      50      }
      51    return 0;
      52  }