https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69494
Bug ID: 69494
Summary: Optimizer eliminates assignment to volatile subobject
Product: gcc
Version: 5.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: deaeod at gmail dot com
Target Milestone: ---
Compiler options: -O1
Code: (http://goo.gl/W1Iubr)
#include <cstdlib>
struct device {
volatile unsigned tcc;
};
void test_device() {
device dev;
unsigned tcc = rand();
dev.tcc = tcc;
}
I expected GCC to generate code that accesses dev.tcc, but failed to find it. I
tested all versions and targets of GCC available at http://gcc.godbolt.org but
never did the compiler generate code for the assignment to dev.tcc at a level
of optimization higher than zero.
I think this is a bug because paragraph 12 of section [intro.execution] of the
C++14 standard specifies that accessing volatile glvalues of objects is a
side-effect, thus observable behavior.
GCC does warn about dev being unused but set, which is misleading as dev is not
being set, but dev.tcc is, and assigning to dev.tcc has side-effects.