blob: 31d741325d9f98187338a56d3d064696b49c325d [file] [log] [blame]
/* Test C2x storage class specifiers in compound literals. Thread-local
cases, execution tests. */
/* { dg-do run } */
/* { dg-options "-pthread -std=gnu2x -pedantic-errors" } */
/* { dg-require-effective-target pthread_h } */
/* { dg-require-effective-target pthread } */
/* { dg-require-effective-target tls_runtime } */
/* { dg-add-options tls } */
#include <pthread.h>
extern void abort (void);
extern void exit (int);
int *
thread_addr ()
{
return (static thread_local int []) { 1, 2 };
}
int *volatile p, *volatile q, r;
void *
thread_fn (void *)
{
q = thread_addr ();
if (q[0] != 1 || q[1] != 2)
return NULL;
q[0] = 5;
q[1] = 6;
return &r;
}
int
main ()
{
int i;
pthread_t tid;
void *ret;
p = thread_addr ();
if (p[0] != 1 || p[1] != 2)
abort ();
p[0] = 3;
p[1] = 4;
if (p != thread_addr ())
abort ();
i = pthread_create (&tid, NULL, thread_fn, NULL);
if (p != thread_addr ())
abort ();
i = pthread_join (tid, &ret);
if (i != 0)
abort ();
if (ret != &r)
abort ();
if (p != thread_addr ())
abort ();
if (p[0] != 3 || p[1] != 4)
abort ();
exit (0);
}