------- Comment #1 from pinskia at gmail dot com 2008-09-30 18:11 ------- Subject: Re: New: C++ over-eager optimization when working with a pointer
Sent from my iPhone On Sep 30, 2008, at 10:26 AM, "jrenggli at gmail dot com" <[EMAIL PROTECTED] > wrote: > The following code results in an error when optimized using -O2 or - > O3 flag, > but works fine with -O1. I've also been able to "confuse" the > optimizer by > adding some code just after or before the line "iX += pA2->iX;" but > I'm not > sure how safe that method is. > > ---------------------- Full code starts here ---------------------- > > #include <iostream> > > class A > { > private: > int32_t iX; > > public: > explicit A(int x) : iX(x) {} > > public: > A& operator*=(const A& a); > > public: > int32_t getX() const { return iX; } > }; > > //////////////////////////////////////////////////////////////// > > A& A::operator*=(const A& B) > { > const A* pA2 = &B; > > int iBothSigns = 0; > if (iX >= 0 && pA2->iX >= 0) > { > iBothSigns = 1; > } > else if (iX < 0 && pA2->iX < 0) > { > iBothSigns = -1; > } > > iX += pA2->iX; > > if (iX >= 0 && iBothSigns == -1) // Expected Signed interger overflow is undefined. > > { > std::cout << "OK" << std::endl; > return *this; > } > else if (iX < 0 && iBothSigns == 1) // Not expected > { > std::cout << "Unexpected" << std::endl; > return *this; > } > std::cout << "Error" << std::endl; > > return *this; > } > > //////////////////////////////////////////////////////////////// > > int main() > { > A n1(-2147483648); > A n2(-2147483648); > > std::cout << "1: expected -2147483648, got " << n1.getX() << > std::endl; > std::cout << "2: expected -2147483648, got " << n2.getX() << > std::endl; > n1 *= n2; > std::cout << "3: expected previous line to be OK" << std::endl; > return 0; > } > > ---------------------- end of code ---------------------- > > ---------------------- compiler output ---------------------- > > g++ -o bugreport.o -c -v -Wall -O3 -pedantic -ansi -save-temps > bugreport.cpp > Using built-in specs. > Target: i486-linux-gnu > Configured with: ../src/configure -v > --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr > --enable-shared --with-system-zlib --libexecdir=/usr/lib > --without-included-gettext --enable-threads=posix --enable-nls > --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 > --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc -- > enable-mpfr > --enable-targets=all --enable-checking=release --build=i486-linux-gnu > --host=i486-linux-gnu --target=i486-linux-gnu > Thread model: posix > gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7) > /usr/lib/gcc/i486-linux-gnu/4.2.3/cc1plus -E -quiet -v -D_GNU_SOURCE > bugreport.cpp -mtune=generic -ansi -Wall -pedantic -O3 -fpch- > preprocess -o > bugreport.ii > ignoring nonexistent directory "/usr/local/include/i486-linux-gnu" > ignoring nonexistent directory > "/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/include" > ignoring nonexistent directory "/usr/include/i486-linux-gnu" > #include "..." search starts here: > #include <...> search starts here: > /usr/include/c++/4.2 > /usr/include/c++/4.2/i486-linux-gnu > /usr/include/c++/4.2/backward > /usr/local/include > /usr/lib/gcc/i486-linux-gnu/4.2.3/include > /usr/include > End of search list. > /usr/lib/gcc/i486-linux-gnu/4.2.3/cc1plus -fpreprocessed > bugreport.ii -quiet > -dumpbase bugreport.cpp -mtune=generic -ansi -auxbase-strip > bugreport.o -O3 > -Wall -pedantic -ansi -version -fstack-protector -fstack-protector -o > bugreport.s > GNU C++ version 4.2.3 (Ubuntu 4.2.3-2ubuntu7) (i486-linux-gnu) > compiled by GNU C version 4.2.3 (Ubuntu 4.2.3-2ubuntu7). > GGC heuristics: --param ggc-min-expand=99 --param ggc-min- > heapsize=129349 > Compiler executable checksum: 9cf91ba46d80e564052e4fbab0d6561b > bugreport.cpp:55: warning: this decimal constant is unsigned only in > ISO C90 > bugreport.cpp:56: warning: this decimal constant is unsigned only in > ISO C90 > as --traditional-format -V -Qy -o bugreport.o bugreport.s > GNU assembler version 2.18.0 (i486-linux-gnu) using BFD version (GNU > Binutils > for Ubuntu) 2.18.0.20080103 > g++ -o bugreport bugreport.o > > > -- > Summary: C++ over-eager optimization when working with a > pointer > Product: gcc > Version: 4.2.3 > Status: UNCONFIRMED > Severity: normal > Priority: P3 > Component: c++ > AssignedTo: unassigned at gcc dot gnu dot org > ReportedBy: jrenggli at gmail dot com > > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37685 > -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37685