I tried to reduce the code to a minimum, so the example does no longer make sense at all. However, the point is, that the code is supposed to return half the count of elements in a container (e.g. if the container holds 16 elements, the function would return 16, if it holds 33 elements, the function would still return 16). Compiled with -O0, things are alright. Using -O1 or -O2 breaks it and the function returns 15 for a container with 32 elements. Compiling with -DWORKS_OK, omitting the template, everything is fine. mrohrbac@linux-5tx5:~/test> uname -a Linux linux-5tx5 2.6.27-rc3-g8d0968ab-24-pae #8d0968abd03ec6b407df117adc773562386702fa SMP 2008/24/14 00:24:3 i686 i686 i386 GNU/Linux mrohrbac@linux-5tx5:~/test> cat test.cxx #include <string> #ifdef WORKS_OK typedef std::string::iterator II; #else template<typename II> #endif size_t test(II from, II end) { size_t cnt=0; while (from != end) { ++from; if (from == end) return cnt; ++from; ++cnt; } return cnt; } int main(int,char**) { std::string s="1234567890abcdef1234567890abcdef"; size_t cnt=test(s.begin(), s.end()); return cnt; } mrohrbac@linux-5tx5:~/test> g++ -v -O1 -Wall -pedantic test.cxx Using built-in specs. Target: i586-suse-linux Configured with: ../configure --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.3 --enable-version-specific-runtime-libs --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=i586-suse-linux Thread model: posix gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) COLLECT_GCC_OPTIONS='-v' '-O1' '-Wall' '-pedantic' '-shared-libgcc' '-mtune=generic' /usr/lib/gcc/i586-suse-linux/4.3/cc1plus -quiet -v -D_GNU_SOURCE test.cxx -quiet -dumpbase test.cxx -mtune=generic -auxbase test -O1 -Wall -pedantic -version -o /tmp/cc0jlsQi.s #include "..." search starts here: #include <...> search starts here: /usr/include/c++/4.3 /usr/include/c++/4.3/i586-suse-linux /usr/include/c++/4.3/backward /usr/local/include /usr/lib/gcc/i586-suse-linux/4.3/include /usr/lib/gcc/i586-suse-linux/4.3/include-fixed /usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/include /usr/include End of search list. GNU C++ (SUSE Linux) version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (i586-suse-linux) compiled by GNU C version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036], GMP version 4.2.2, MPFR version 2.3.1. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 0a1ff4dd89b2c90c4ec1f432d1f05160 COLLECT_GCC_OPTIONS='-v' '-O1' '-Wall' '-pedantic' '-shared-libgcc' '-mtune=generic' /usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/as -V -Qy -o /tmp/cc8Gof5B.o /tmp/cc0jlsQi.s GNU assembler version 2.18.50 (i586-suse-linux) using BFD version (GNU Binutils; openSUSE 11.0) 2.18.50.20080409-11.1 COMPILER_PATH=/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/:/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/ LIBRARY_PATH=/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/4.3/:/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/lib/:/usr/lib/gcc/i586-suse-linux/4.3/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-O1' '-Wall' '-pedantic' '-shared-libgcc' '-mtune=generic' /usr/lib/gcc/i586-suse-linux/4.3/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i586-suse-linux/4.3/../../../crt1.o /usr/lib/gcc/i586-suse-linux/4.3/../../../crti.o /usr/lib/gcc/i586-suse-linux/4.3/crtbegin.o -L/usr/lib/gcc/i586-suse-linux/4.3 -L/usr/lib/gcc/i586-suse-linux/4.3 -L/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/lib -L/usr/lib/gcc/i586-suse-linux/4.3/../../.. /tmp/cc8Gof5B.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/i586-suse-linux/4.3/crtend.o /usr/lib/gcc/i586-suse-linux/4.3/../../../crtn.o
This was fixed in GCC 4.3.2.