https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98965
Bug ID: 98965 Summary: assingment to a struct with an atomic member not atomic Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- When a struct with an atomic member is assigned to, the assignment is treated the same as one to a struct with all ordinary (non-atomic) members. For example, in the test case below, GCC emits an atomic assignment for the one in f() but a series of orinary assignments in g(). Either both assignments should be atomic, or the second one should trigger a diagnostic. $ cat t.c && gcc -O2 -S -Wall -Wextra -Wpedantic -fdump-tree-optimized=/dev/stdout t.c struct A { char a[33]; }; typedef _Atomic struct A AA; AA a; void f (const struct A *p) { a = *p; // atomic } struct B { AA a; } b; void g (const struct B *p) { b = *p; // non-atomic } ;; Function f (f, funcdef_no=0, decl_uid=1947, cgraph_uid=1, symbol_order=1) void f (const struct A * p) { struct A D.1949; <bb 2> [local count: 1073741824]: D.1949 = *p_2(D); __atomic_store (33, &a, &D.1949, 5); return; } ;; Function g (g, funcdef_no=1, decl_uid=1954, cgraph_uid=2, symbol_order=3) void g (const struct B * p) { <bb 2> [local count: 1073741824]: b = *p_2(D); return; }