Issue with a static const int value of a template class instenciated as a left-hand operand of comma. The error is an "undefined reference to" during link which seems quite strange.
<mylife> I found this issue because I wrote a ',' instead of '|' in my source code. Without the -Wall warning: "left-hand operand of comma has no effect" I should not be able to found the problem</mylife> It doesn't seem important but perhaps there is other impacts. Note I also try with 3.4.6 redhat with same result. Please apologize if it's a feature ;o) Source (.cpp and .ii are the same): template<int X> struct value { static const int is =X; }; int main() { int i=0; int j=value<1>::is; if (i,++i,1,value<1>::is) {++i;} if (i) return 0; else return 1; } Compilation: g++ -v --save-temps main.cpp Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../gcc-4.3.1/configure --prefix=/sw/gcc/4.3.1/Linux-i686 --with-gnu-as --with-as=/sw/gcc/4.3.1/Linux-i686/bin/as --with-gnu-ld --with-ld=/sw/gcc/4.3.1/Linux-i686/bin/ld --with-gmp-lib=/sw/Linux-i686/lib --with-gmp-include=/sw/Linux-i686/include --with-mpfr-lib=/sw/Linux-i686/lib --with-mpfr-include=/sw/Linux-i686/include --disable-nls --enable-shared --enable-long-long --enable-checking --enable-__cxa_atexit --enable-languages=c,c++ --enable-threads Thread model: posix gcc version 4.3.1 (GCC) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' /sw/gcc/4.3.1/Linux-i686/libexec/gcc/i686-pc-linux-gnu/4.3.1/cc1plus -E -quiet -v -D_GNU_SOURCE main.cpp -mtune=generic -fpch-preprocess -o main.ii ignoring nonexistent directory "/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../i686-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../include/c++/4.3.1 /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../include/c++/4.3.1/i686-pc-linux-gnu /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../include/c++/4.3.1/backward /usr/local/include /sw/gcc/4.3.1/Linux-i686/include /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/include /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/include-fixed /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' /sw/gcc/4.3.1/Linux-i686/libexec/gcc/i686-pc-linux-gnu/4.3.1/cc1plus -fpreprocessed main.ii -quiet -dumpbase main.cpp -mtune=generic -auxbase main -version -o main.s GNU C++ (GCC) version 4.3.1 (i686-pc-linux-gnu) compiled by GNU C version 4.3.1, GMP version 4.2.2, MPFR version 2.3.1. warning: GMP header version 4.2.2 differs from library version 4.1.4. GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096 Compiler executable checksum: e6893af2b111fce95679cea083c2c159 COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' /sw/gcc/4.3.1/Linux-i686/bin/as -v -V -Qy -o main.o main.s GNU assembler version 2.18 (i686-pc-linux-gnu) using BFD version (GNU Binutils) 2.18 COMPILER_PATH=/sw/gcc/4.3.1/Linux-i686/libexec/gcc/i686-pc-linux-gnu/4.3.1/:/sw/gcc/4.3.1/Linux-i686/libexec/gcc/i686-pc-linux-gnu/4.3.1/:/sw/gcc/4.3.1/Linux-i686/libexec/gcc/i686-pc-linux-gnu/:/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/:/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/:/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../i686-pc-linux-gnu/bin/ LIBRARY_PATH=/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/:/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../i686-pc-linux-gnu/lib/:/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' /sw/gcc/4.3.1/Linux-i686/libexec/gcc/i686-pc-linux-gnu/4.3.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/crtbegin.o -L/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1 -L/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../../../i686-pc-linux-gnu/lib -L/sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/../../.. main.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /sw/gcc/4.3.1/Linux-i686/lib/gcc/i686-pc-linux-gnu/4.3.1/crtend.o /usr/lib/crtn.o main.o: In function `main': main.cpp:(.text+0x24): undefined reference to `value<1>::is' collect2: ld returned 1 exit status -- Summary: Link error with a no effect lefthand operand of comma on a very small code Product: gcc Version: 4.3.1 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: maxime dot fiandino at gmail dot com GCC build triplet: i386-redhat-linux GCC host triplet: i386-redhat-linux GCC target triplet: i386-redhat-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37111