| /* 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); |
| } |