/* { dg-do link { target c++11 } } */ /* { dg-final { simulate-thread } } */ /* { dg-require-effective-target sync_char_short } */ /* { dg-require-effective-target sync_int_long } */ /* Test that atomic int and atomic char work properly. */ using namespace std; #include #include #include #include "simulate-thread.h" atomic atomi; atomic atomc; /* No need for parallel threads to do anything */ void simulate_thread_other_threads() { } /* Verify after every instruction is executed, that the atmoic int and char have one of the 2 legitimate values. */ int simulate_thread_step_verify() { if (atomi != 0 && atomi != INT_MAX) { printf ("FAIL: invalid intermediate result for atomi (%d).\n", (int)atomi); return 1; } if (atomc != 0 && atomc != CHAR_MAX) { printf ("FAIL: invalid intermediate result for atomc (%d).\n", (int)atomc); return 1; } return 0; } /* Verify that both atmoics have the corerct value. */ int simulate_thread_final_verify() { if (atomi != INT_MAX) { printf ("FAIL: invalid final result for atomi (%d).\n", (int)atomi); return 1; } if (atomc != CHAR_MAX) { printf ("FAIL: invalid final result for atomc (%d).\n", (int)atomc); return 1; } return 0; } /* Test a store to an atomic int and an atomic char. */ __attribute__((noinline)) void simulate_thread_main() { atomi = INT_MAX; atomc = CHAR_MAX; } int main () { simulate_thread_main(); simulate_thread_done(); return 0; }