vlabella / GLE

GLE - Graphics Layout Engine
BSD 3-Clause "New" or "Revised" License
22 stars 10 forks source link

Build fails with LTO due to ODR violations #35

Open eli-schwartz opened 2 months ago

eli-schwartz commented 2 months ago

I tried to build with the following *FLAGS to optimize the build: -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing

Note the -Werror=* flags are used to help detect cases where the compiler tries to optimize by assuming UB cannot exist in the source code -- if it does exist, ordinarily the code would be miscompiled, and this says to make the miscompilation a fatal error.

I got this error:

[80/242] : && /usr/bin/x86_64-pc-linux-gnu-g++ -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing  -Wformat -Werror=format-security -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/gle.dir/gle.cpp.o -o gle/gle  /usr/lib64/libtiff.so  /usr/lib64/libz.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libz.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so && :
FAILED: gle/gle 
: && /usr/bin/x86_64-pc-linux-gnu-g++ -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing  -Wformat -Werror=format-security -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/gle.dir/gle.cpp.o -o gle/gle  /usr/lib64/libtiff.so  /usr/lib64/libz.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libz.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so && :
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: error: type ‘struct keyw’ violates the C++ One Definition Rule [-Werror=odr]
   97 | struct keyw
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:8: note: a different type is defined in another translation unit
   58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:99:15: note: the first difference of corresponding definitions is field ‘word’
   99 |         char *word;
      |               ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:27: note: a field of same name but different type is defined in another translation unit
   58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
      |                           ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: note: type ‘char’ should match type ‘const char’
   97 | struct keyw
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:8: error: type ‘struct mark_struct’ violates the C++ One Definition Rule [-Werror=odr]
 1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:8: note: a different type is defined in another translation unit
 2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:26: note: the first difference of corresponding definitions is field ‘ff’
 1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
      |                          ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:34: note: a field with different name is defined in another translation unit
 2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
      |                                  ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: /usr/bin/x86_64-pc-linux-gnu-g++ returned 1 exit status
compilation terminated.
/usr/libexec/gcc/x86_64-pc-linux-gnu/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
[81/242] : && /usr/bin/x86_64-pc-linux-gnu-g++ -fPIC -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing  -Wformat -Werror=format-security  -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0   -fPIC -shared -Wl,-soname,liblibgle-graphics.so -o gle/liblibgle-graphics.so gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/libgle-graphics.dir/gle_cpp_lib.cpp.o  /usr/lib64/libtiff.so  /usr/lib64/libz.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libz.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so && :
FAILED: gle/liblibgle-graphics.so 
: && /usr/bin/x86_64-pc-linux-gnu-g++ -fPIC -pipe -march=native -fstack-protector-all -O2 -fdiagnostics-color=always -frecord-gcc-switches -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing  -Wformat -Werror=format-security  -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0   -fPIC -shared -Wl,-soname,liblibgle-graphics.so -o gle/liblibgle-graphics.so gle/CMakeFiles/gle_common.dir/bitmap/img2ps.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/lzwencode.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glegif.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glejpeg.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/gletiff.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/glepng.cpp.o gle/CMakeFiles/gle_common.dir/bitmap/ascii85.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/let.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/fit.cpp.o gle/CMakeFiles/gle_common.dir/letzfitz/ffit.cpp.o gle/CMakeFiles/gle_common.dir/surface/gsurface.cpp.o gle/CMakeFiles/gle_common.dir/surface/hide.cpp.o gle/CMakeFiles/gle_common.dir/surface/fcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/ffitcontour.cpp.o gle/CMakeFiles/gle_common.dir/surface/gcontour.cpp.o gle/CMakeFiles/gle_common.dir/tokens/Tokenizer.cpp.o gle/CMakeFiles/gle_common.dir/tokens/StringKeyHash.cpp.o gle/CMakeFiles/gle_common.dir/tokens/BinIO.cpp.o gle/CMakeFiles/gle_common.dir/axis.cpp.o gle/CMakeFiles/gle_common.dir/b_tab.cpp.o gle/CMakeFiles/gle_common.dir/b_text.cpp.o gle/CMakeFiles/gle_common.dir/begin.cpp.o gle/CMakeFiles/gle_common.dir/core.cpp.o gle/CMakeFiles/gle_common.dir/curve.cpp.o gle/CMakeFiles/gle_common.dir/color.cpp.o gle/CMakeFiles/gle_common.dir/drawit.cpp.o gle/CMakeFiles/gle_common.dir/eval.cpp.o gle/CMakeFiles/gle_common.dir/fitbez.cpp.o gle/CMakeFiles/gle_common.dir/fitcf.cpp.o gle/CMakeFiles/gle_common.dir/fn.cpp.o gle/CMakeFiles/gle_common.dir/font.cpp.o gle/CMakeFiles/gle_common.dir/general.cpp.o gle/CMakeFiles/gle_common.dir/op_def.cpp.o gle/CMakeFiles/gle_common.dir/gprint.cpp.o gle/CMakeFiles/gle_common.dir/graph.cpp.o gle/CMakeFiles/gle_common.dir/graph2.cpp.o gle/CMakeFiles/gle_common.dir/key.cpp.o gle/CMakeFiles/gle_common.dir/keyword.cpp.o gle/CMakeFiles/gle_common.dir/leastsq.cpp.o gle/CMakeFiles/gle_common.dir/memory.cpp.o gle/CMakeFiles/gle_common.dir/mychar.cpp.o gle/CMakeFiles/gle_common.dir/pass.cpp.o gle/CMakeFiles/gle_common.dir/polish.cpp.o gle/CMakeFiles/gle_common.dir/run.cpp.o gle/CMakeFiles/gle_common.dir/savgol.cpp.o gle/CMakeFiles/gle_common.dir/sub.cpp.o gle/CMakeFiles/gle_common.dir/tex.cpp.o gle/CMakeFiles/gle_common.dir/token.cpp.o gle/CMakeFiles/gle_common.dir/var.cpp.o gle/CMakeFiles/gle_common.dir/cutils.cpp.o gle/CMakeFiles/gle_common.dir/texinterface.cpp.o gle/CMakeFiles/gle_common.dir/d_ps.cpp.o gle/CMakeFiles/gle_common.dir/d_svg.cpp.o gle/CMakeFiles/gle_common.dir/d_x.cpp.o gle/CMakeFiles/gle_common.dir/d_dummy.cpp.o gle/CMakeFiles/gle_common.dir/d_cairo.cpp.o gle/CMakeFiles/gle_common.dir/config.cpp.o gle/CMakeFiles/gle_common.dir/numberformat.cpp.o gle/CMakeFiles/gle_common.dir/glearray.cpp.o gle/CMakeFiles/gle_common.dir/cmdline.cpp.o gle/CMakeFiles/gle_common.dir/gle-block.cpp.o gle/CMakeFiles/gle_common.dir/gle-sourcefile.cpp.o gle/CMakeFiles/gle_common.dir/gle-interface.cpp.o gle/CMakeFiles/gle_common.dir/gle-base.cpp.o gle/CMakeFiles/gle_common.dir/gle-datatype.cpp.o gle/CMakeFiles/gle_common.dir/gle-poppler.cpp.o gle/CMakeFiles/gle_common.dir/builtin-double.cpp.o gle/CMakeFiles/gle_common.dir/file_io.cpp.o gle/CMakeFiles/gle_common.dir/specialfunctions.cpp.o gle/CMakeFiles/libgle-graphics.dir/gle_cpp_lib.cpp.o  /usr/lib64/libtiff.so  /usr/lib64/libz.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libz.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so  /usr/lib64/libjpeg.so  /usr/lib64/libpng.so  /usr/lib64/libcairo.so  /usr/lib64/libpixman-1.so  /usr/lib64/liblzma.so && :
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: error: type ‘struct keyw’ violates the C++ One Definition Rule [-Werror=odr]
   97 | struct keyw
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:8: note: a different type is defined in another translation unit
   58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:99:15: note: the first difference of corresponding definitions is field ‘word’
   99 |         char *word;
      |               ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/fn.cpp:58:27: note: a field of same name but different type is defined in another translation unit
   58 | struct keyw { const char *word; int index; int ret,np,p[5]; } keywfn[] = {
      |                           ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/eval.cpp:97:8: note: type ‘char’ should match type ‘const char’
   97 | struct keyw
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:8: error: type ‘struct mark_struct’ violates the C++ One Definition Rule [-Werror=odr]
 1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:8: note: a different type is defined in another translation unit
 2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
      |        ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/core.cpp:1868:26: note: the first difference of corresponding definitions is field ‘ff’
 1868 | struct mark_struct { int ff; int cc; double rx; double ry; double scl; double x1; double x2; double y1; double y2; };
      |                          ^
/var/tmp/portage/sci-visualization/gle-9999/work/gle-9999/src/gle/pass.cpp:2367:34: note: a field with different name is defined in another translation unit
 2367 | struct mark_struct { const char *name; const char *font; int cc; double rx; double ry; double scl; bool center;};
      |                                  ^
lto1: some warnings being treated as errors
lto-wrapper: fatal error: /usr/bin/x86_64-pc-linux-gnu-g++ returned 1 exit status
compilation terminated.
/usr/libexec/gcc/x86_64-pc-linux-gnu/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
ninja: build stopped: cannot make progress due to previous errors.

Originally reported downstream: https://bugs.gentoo.org/927779 Full build log: build.log

ryandesign commented 2 months ago

error: type ‘…’ violates the C++ One Definition Rule [-Werror=odr]

This message can also be seen—as a warning—in the GitHub Actions logs for ubuntu-latest in this repository, which builds using gcc. Such a message is not seen in the macos-latest jobs; those use clang.

eli-schwartz commented 2 months ago

Yup -- clang is generally unable to diagnose this sort of thing as its LTO implementation doesn't retain the rich annotations gcc does.

vlabella commented 2 months ago

can LTO be disabled in this instance?

eli-schwartz commented 2 months ago

Disabling LTO does not fix the issue whereby the C++ One Definition Rule is being broken resulting in Undefined Behavior.

Sure, you can not build with LTO. The bug is still there but then the compiler won't be able to warn you about the bug. Is that an improvement? I don't think so.