https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117425
Bug ID: 117425
Summary: Miscompile with different optimization flags
Product: gcc
Version: 4.7.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: yunboni at smail dot nju.edu.cn
Target Milestone: ---
When I compiled this code with -O1/2/3, its output would be 8. However, with
-O0, its output is 7:
```c
int printf(const char *, ...);
int a;
long b = 1;
long *c = &b, *d = &b;
int e() {
for (; *d + a <= 7; a++)
;
return 0;
}
int main() {
e() | ((*c = 0, 0) || 0);
printf("%d\n", a);
return 0;
}
```
The version is gcc 4.7.3. I've checked the code with -Wall and -Wextra. The
unused warning seems to have no influence on this miscompilation. When I assign
a varibale to e() | ((*c = 0, 0) || 0) and print the value, it's always 0 and
the value of a is still different.
The details can be found here: https://godbolt.org/z/eWPTW5E7c