This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/81606] New: A small program works as expected with -O0 but fails with -O1 on all tested gcc versions
- From: "jerome.pioux at atos dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 28 Jul 2017 20:31:40 +0000
- Subject: [Bug c++/81606] New: A small program works as expected with -O0 but fails with -O1 on all tested gcc versions
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81606
Bug ID: 81606
Summary: A small program works as expected with -O0 but fails
with -O1 on all tested gcc versions
Product: gcc
Version: 7.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: jerome.pioux at atos dot net
Target Milestone: ---
Created attachment 41859
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41859&action=edit
Two .ii files (compiled with -O0 and -O1)
Intel(R) Xeon(R) CPU E7- 487
Centos 7.3 x86_64
gcc (GCC) 7.1.0
The program originally failed using gcc 4.8.5 20150623 (CentOS 7 default).
I built gcc 7.1.0 from source to verify that the problem still existed using a
later gcc version.
There is a difference though. On 4.8.5, the program only worked using -O0 and
failed with -O1 ,-O2 or -O3.
On 7.1.0, the program only failed with -O1.
Program compilation (no warnings):
g++ gccproblem.cpp -o gccproblem -O[0-3] -save-temps
Note that gcc seems to be trying to use the character "B" in the string
"NC0404B" below when it makes the comparison if ("A" >= "B")
Note also that the problem only occurs when the "B" in NC0404B and the "B" in
the IF statement are the same, AND the "B" has to be the LAST character in the
string "NC0404B".
There is no problem when the "B" is elsewhere in the string, that is, not the
last character.
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>
int main (int argc, char *argv[]) {
std::string dummy="NC0404B";
if ("A" >= "B") {
std::cout << "FAILS." << std::endl;
}
else {
std::cout << "PASSES." << std::endl;
}
return (0);
};