https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86113
Bug ID: 86113
Summary: __builtin_nan has "const" attribute
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: gfalcon at google dot com
Target Milestone: ---
__builtin_nan and friends incorrectly have ATTR_CONST. This leads the
optimizer into generating incorrect code. This issue also infects std::nan()
and friends.
The two functions below return different answers in -O1 and above:
double a() {
char buf[4];
buf[0] = buf[1] = buf[2] = '9';
buf[3] = '\0';
return nan(buf);
}
double b() { return nan("999"); }
In a(), the optimizer thinks that nothing reads the contents of `buf`, and
eliminates the assignments. See https://godbolt.org/g/RGHnXQ.