Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/simulate-thread/bitfields-2.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
/* { dg-do link } */ /* { dg-options "-fno-allow-store-data-races" } */ /* { dg-final { simulate-thread } } */ /* Test that setting <var.a> does not touch either <var.b> or <var.c>. In the C++ memory model, non contiguous bitfields ("a" and "c" here) should be considered as distinct memory locations, so we can't use bit twiddling to set either one. */ #include <stdio.h> #include "simulate-thread.h" #define CONSTA 12 static int global; struct S { unsigned int a : 4; unsigned char b; unsigned int c : 6; } var; __attribute__((noinline)) void set_a() { var.a = CONSTA; } void simulate_thread_other_threads() { ++global; var.b = global; var.c = global; } int simulate_thread_step_verify() { int ret = 0; if (var.b != global) { printf ("FAIL: Unexpected value: var.b is %d, should be %d\n", var.b, global); ret = 1; } if (var.c != global) { printf ("FAIL: Unexpected value: var.c is %d, should be %d\n", var.c, global); ret = 1; } return ret; } int simulate_thread_final_verify() { int ret = simulate_thread_step_verify(); if (var.a != CONSTA) { printf ("FAIL: Unexpected value: var.a is %d, should be %d\n", var.a, CONSTA); ret = 1; } return ret; } __attribute__((noinline)) void simulate_thread_main() { set_a(); } int main() { simulate_thread_main(); simulate_thread_done(); return 0; }