https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93744
Bug ID: 93744 Summary: Different results between gcc-9 and gcc-7 Product: gcc Version: 9.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: k.even-mendoza at imperial dot ac.uk Target Milestone: --- Seen on: 18.04.3 LTS (Bionic Beaver) kar@kar-VirtualBox:~/example1$ gcc-9 ex1.c -o ex kar@kar-VirtualBox:~/example1$ ./ex 0 kar@kar-VirtualBox:~/example1$ gcc-7 ex1.c -o ex kar@kar-VirtualBox:~/example1$ ./ex 2 kar@kar-VirtualBox:~/example1$ more ex1.c #include <stdio.h> typedef int int32_t; int main() { int a = 0; int32_t b = 0; (a > 0) * (b |= 2); printf("%d\n", b); } === 1. Output shall be 2 instead of 0. 2. GCC-8 and GCC-9 produce 0. gcc-9 (Ubuntu 9.2.1-17ubuntu1~18.04.1) 9.2.1 20191102 gcc-8 (Ubuntu 8.3.0-6ubuntu1~18.04.1) 8.3.0 gcc-7 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 compiled: gcc-9 ex1.c -o ex 3. Explanation: (a > 0) * (b |= 2); ==> b here shall be set to 2, but since (a > 0) is 0, the side effect of evaluating b is skipped. As a result printf("%d\n", b); prints to the screen 0 instead of 2. 4. GCC-7 and LLVM (for example) produce 2. Note: You can try to compile the code with GCC-7 or llvm to observe the behaviour where the output is 2.