RenderKit / embree

Embree ray tracing kernels repository.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Build fails with LTO

eli-schwartz opened this issue · comments

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:

FAILED: libembree4.so.4.3.1 
: && /usr/bin/x86_64-pc-linux-gnu-g++ -fPIC -fstack-protector-all -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-clash-protection -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wformat -Werror=format-security -Wall -Wformat -Wformat-security -Wno-class-memaccess -fno-strict-overflow -fno-delete-null-pointer-checks -fwrapv -fsigned-char -fPIE -fPIC -std=c++11 -fvisibility=hidden -fvisibility-inlines-hidden -fno-strict-aliasing -fno-tree-vectorize -D_FORTIFY_SOURCE=2  -g -DNDEBUG -O3  -Wl,-O1 -Wl,--as-needed -flto=4 -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -Wl,--defsym=__gentoo_check_ldflags__=0 -Wl,--no-undefined -z noexecstack -z relro -z now  -Wl,--version-script="/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/export.linux.map" -shared -Wl,-soname,libembree4.so.4 -o libembree4.so.4.3.1 kernels/CMakeFiles/embree.dir/common/device.cpp.o kernels/CMakeFiles/embree.dir/common/stat.cpp.o kernels/CMakeFiles/embree.dir/common/acceln.cpp.o kernels/CMakeFiles/embree.dir/common/accelset.cpp.o kernels/CMakeFiles/embree.dir/common/state.cpp.o kernels/CMakeFiles/embree.dir/common/rtcore.cpp.o kernels/CMakeFiles/embree.dir/common/rtcore_builder.cpp.o kernels/CMakeFiles/embree.dir/common/scene.cpp.o kernels/CMakeFiles/embree.dir/common/scene_verify.cpp.o kernels/CMakeFiles/embree.dir/common/alloc.cpp.o kernels/CMakeFiles/embree.dir/common/geometry.cpp.o kernels/CMakeFiles/embree.dir/common/scene_user_geometry.cpp.o kernels/CMakeFiles/embree.dir/common/scene_instance.cpp.o kernels/CMakeFiles/embree.dir/common/scene_instance_array.cpp.o kernels/CMakeFiles/embree.dir/common/scene_triangle_mesh.cpp.o kernels/CMakeFiles/embree.dir/common/scene_quad_mesh.cpp.o kernels/CMakeFiles/embree.dir/common/scene_curves.cpp.o kernels/CMakeFiles/embree.dir/common/scene_line_segments.cpp.o kernels/CMakeFiles/embree.dir/common/scene_grid_mesh.cpp.o kernels/CMakeFiles/embree.dir/common/scene_points.cpp.o kernels/CMakeFiles/embree.dir/common/motion_derivative.cpp.o kernels/CMakeFiles/embree.dir/subdiv/bezier_curve.cpp.o kernels/CMakeFiles/embree.dir/subdiv/bspline_curve.cpp.o kernels/CMakeFiles/embree.dir/subdiv/catmullrom_curve.cpp.o kernels/CMakeFiles/embree.dir/geometry/primitive4.cpp.o kernels/CMakeFiles/embree.dir/geometry/instance_intersector.cpp.o kernels/CMakeFiles/embree.dir/geometry/instance_array_intersector.cpp.o kernels/CMakeFiles/embree.dir/geometry/curve_intersector_virtual_4v.cpp.o kernels/CMakeFiles/embree.dir/geometry/curve_intersector_virtual_4i.cpp.o kernels/CMakeFiles/embree.dir/geometry/curve_intersector_virtual_4i_mb.cpp.o kernels/CMakeFiles/embree.dir/geometry/curve_intersector_virtual_8v.cpp.o kernels/CMakeFiles/embree.dir/geometry/curve_intersector_virtual_8i.cpp.o kernels/CMakeFiles/embree.dir/geometry/curve_intersector_virtual_8i_mb.cpp.o kernels/CMakeFiles/embree.dir/builders/primrefgen.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_statistics.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh4_factory.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh8_factory.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_collider.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_rotate.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_refit.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_hair.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_hair_mb.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_morton.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_sah.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_sah_spatial.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_sah_mb.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_twolevel.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_intersector1_bvh4.cpp.o kernels/CMakeFiles/embree.dir/common/scene_subdiv_mesh.cpp.o kernels/CMakeFiles/embree.dir/subdiv/tessellation_cache.cpp.o kernels/CMakeFiles/embree.dir/subdiv/subdivpatch1base.cpp.o kernels/CMakeFiles/embree.dir/subdiv/catmullclark_coefficients.cpp.o kernels/CMakeFiles/embree.dir/geometry/grid_soa.cpp.o kernels/CMakeFiles/embree.dir/subdiv/subdivpatch1base_eval.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_builder_subdiv.cpp.o kernels/CMakeFiles/embree.dir/bvh/bvh_intersector_hybrid4_bvh4.cpp.o  libembree_sse42.a  libembree_avx.a  libembree_avx2.a  libsys.a  libmath.a  libsimd.a  liblexers.a  libtasking.a  /usr/lib64/libtbb.so.12.9  libsys.a  -ldl  libmath.a && :
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:12:10: error: type ‘struct vfloat_impl’ violates the C++ One Definition Rule [-Werror=odr]
   12 |   struct vfloat_impl
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vfloat8_avx.h:18:10: note: a different type is defined in another translation unit
   18 |   struct vfloat<8>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:14:5: note: the first difference of corresponding definitions is field ‘<anonymous>’
   14 |     union { float f[N]; int i[N]; };
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vfloat8_avx.h:27:5: note: a field of same name but different type is defined in another translation unit
   27 |     union { __m256 v; float f[8]; int i[8]; }; // data
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:14:11: note: type name ‘embree::vfloat_impl<8>::{unnamed type#1}’ should match type name ‘embree::vfloat_impl<8>::{unnamed type#2}’
   14 |     union { float f[N]; int i[N]; };
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vfloat8_avx.h:27:11: note: the incompatible type is defined here
   27 |     union { __m256 v; float f[8]; int i[8]; }; // data
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:36:10: error: type ‘struct vuint_impl’ violates the C++ One Definition Rule [-Werror=odr]
   36 |   struct vuint_impl
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vuint8_avx.h:18:10: note: a different type is defined in another translation unit
   18 |   struct vuint<8>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:38:18: note: the first difference of corresponding definitions is field ‘i’
   38 |     unsigned int i[N];
      |                  ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vuint8_avx.h:27:5: note: a field with different name is defined in another translation unit
   27 |     union {                    // data
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:21:14: error: type ‘struct <anon>’ violates the C++ One Definition Rule [-Werror=odr]
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:21:14: note: a different type is defined in another translation unit
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:22:11: note: the first difference of corresponding definitions is field ‘x’
   22 |         T x, y, z;
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:22:11: note: a field of same name but different type is defined in another translation unit
   22 |         T x, y, z;
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:12:10: note: type ‘struct vfloat_impl’ itself violates the C++ One Definition Rule
   12 |   struct vfloat_impl
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vfloat8_avx.h:18:10: note: the incompatible type is defined here
   18 |   struct vfloat<8>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:20:11: error: type ‘union <anon>’ violates the C++ One Definition Rule [-Werror=odr]
   20 |     union {
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:20:11: note: a different type is defined in another translation unit
   20 |     union {
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:21:7: note: the first difference of corresponding definitions is field ‘<anonymous>’
   21 |       struct {
      |       ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:21:7: note: a field of same name but different type is defined in another translation unit
   21 |       struct {
      |       ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:21:14: note: type ‘struct <anon>’ itself violates the C++ One Definition Rule
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:21:14: note: the incompatible type is defined here
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:16:31: error: type ‘struct Vec3’ violates the C++ One Definition Rule [-Werror=odr]
   16 |   template<typename T> struct Vec3
      |                               ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:16:31: note: a different type is defined in another translation unit
   16 |   template<typename T> struct Vec3
      |                               ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:20:5: note: the first difference of corresponding definitions is field ‘<anonymous>’
   20 |     union {
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:20:5: note: a field of same name but different type is defined in another translation unit
   20 |     union {
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/vec3.h:20:11: note: type ‘union <anon>’ itself violates the C++ One Definition Rule
   20 |     union {
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/vec3.h:20:11: note: the incompatible type is defined here
   20 |     union {
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:28:10: error: type ‘struct vint_impl’ violates the C++ One Definition Rule [-Werror=odr]
   28 |   struct vint_impl
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx.h:18:10: note: a different type is defined in another translation unit
   18 |   struct vint<8>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/../../common/sys/../math/../simd/varying.h:30:9: note: the first difference of corresponding definitions is field ‘i’
   30 |     int i[N];
      |         ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx.h:27:5: note: a field with different name is defined in another translation unit
   27 |     union {                    // data
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/ray.h:15:10: error: type ‘struct RayK’ violates the C++ One Definition Rule [-Werror=odr]
   15 |   struct RayK
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/ray.h:15:10: note: a different type is defined in another translation unit
   15 |   struct RayK
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/ray.h:56:15: note: the first difference of corresponding definitions is field ‘org’
   56 |     Vec3vf<K> org;    // ray origin
      |               ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/ray.h:56:15: note: a field of same name but different type is defined in another translation unit
   56 |     Vec3vf<K> org;    // ray origin
      |               ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/ray.h:15:10: note: type ‘struct Vec3vf’ itself violates the C++ One Definition Rule
   15 |   struct RayK
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/common/ray.h:73:10: error: type ‘struct RayHitK’ violates the C++ One Definition Rule [-Werror=odr]
   73 |   struct RayHitK : RayK<K>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/ray.h:73:10: note: a type with different bases is defined in another translation unit
   73 |   struct RayHitK : RayK<K>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vuint8_avx.h:27:11: error: type ‘union <anon>’ violates the C++ One Definition Rule [-Werror=odr]
   27 |     union {                    // data
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vuint8_avx2.h:27:11: note: a different type is defined in another translation unit
   27 |     union {             // data
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vuint8_avx.h:29:7: note: the first difference of corresponding definitions is field ‘<anonymous>’
   29 |       struct { __m128i vl,vh; };
      |       ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vuint8_avx2.h:29:20: note: a field with different name is defined in another translation unit
   29 |       unsigned int i[8];
      |                    ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx.h:27:11: error: type ‘union <anon>’ violates the C++ One Definition Rule [-Werror=odr]
   27 |     union {                    // data
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx2.h:27:11: note: a different type is defined in another translation unit
   27 |     union {             // data
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx.h:29:7: note: the first difference of corresponding definitions is field ‘<anonymous>’
   29 |       struct { __m128i vl,vh; };
      |       ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx2.h:29:11: note: a field with different name is defined in another translation unit
   29 |       int i[8];
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/hit.h:14:12: error: type ‘struct HitK’ violates the C++ One Definition Rule [-Werror=odr]
   14 |     struct HitK
      |            ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/hit.h:14:12: note: a different type is defined in another translation unit
   14 |     struct HitK
      |            ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/hit.h:47:14: note: the first difference of corresponding definitions is field ‘primID’
   47 |     vuint<K> primID;      // primitive ID
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/hit.h:47:14: note: a field of same name but different type is defined in another translation unit
   47 |     vuint<K> primID;      // primitive ID
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/hit.h:14:12: note: type ‘struct vuint’ itself violates the C++ One Definition Rule
   14 |     struct HitK
      |            ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/pointi.h:11:10: error: type ‘struct PointMi’ violates the C++ One Definition Rule [-Werror=odr]
   11 |   struct PointMi
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/pointi.h:11:10: note: a different type is defined in another translation unit
   11 |   struct PointMi
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/pointi.h:224:14: note: the first difference of corresponding definitions is field ‘primIDs’
  224 |     vuint<M> primIDs;  // primitive ID
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/pointi.h:224:14: note: a field of same name but different type is defined in another translation unit
  224 |     vuint<M> primIDs;  // primitive ID
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/pointi.h:11:10: note: type ‘struct vuint’ itself violates the C++ One Definition Rule
   11 |   struct PointMi
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/linei.h:11:10: error: type ‘struct LineMi’ violates the C++ One Definition Rule [-Werror=odr]
   11 |   struct LineMi
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/linei.h:11:10: note: a different type is defined in another translation unit
   11 |   struct LineMi
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/linei.h:271:14: note: the first difference of corresponding definitions is field ‘v0’
  271 |     vuint<M> v0;      // index of start vertex
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/linei.h:271:14: note: a field of same name but different type is defined in another translation unit
  271 |     vuint<M> v0;      // index of start vertex
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/linei.h:11:10: note: type ‘struct vuint’ itself violates the C++ One Definition Rule
   11 |   struct LineMi
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:21:14: error: type ‘struct <anon>’ violates the C++ One Definition Rule [-Werror=odr]
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:21:14: note: a different type is defined in another translation unit
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:22:11: note: the first difference of corresponding definitions is field ‘x’
   22 |         T x, y, z;
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:22:11: note: a field of same name but different type is defined in another translation unit
   22 |         T x, y, z;
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx.h:18:10: note: type ‘struct vint_impl’ itself violates the C++ One Definition Rule
   18 |   struct vint<8>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/geometry/../common/../../common/sys/../math/../simd/vint8_avx2.h:18:10: note: the incompatible type is defined here
   18 |   struct vint<8>
      |          ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:20:11: error: type ‘union <anon>’ violates the C++ One Definition Rule [-Werror=odr]
   20 |     union {
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:20:11: note: a different type is defined in another translation unit
   20 |     union {
      |           ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:21:7: note: the first difference of corresponding definitions is field ‘<anonymous>’
   21 |       struct {
      |       ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:21:7: note: a field of same name but different type is defined in another translation unit
   21 |       struct {
      |       ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:21:14: note: type ‘struct <anon>’ itself violates the C++ One Definition Rule
   21 |       struct {
      |              ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:16:31: error: type ‘struct Vec3’ violates the C++ One Definition Rule [-Werror=odr]
   16 |   template<typename T> struct Vec3
      |                               ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:16:31: note: a different type is defined in another translation unit
   16 |   template<typename T> struct Vec3
      |                               ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:20:5: note: the first difference of corresponding definitions is field ‘<anonymous>’
   20 |     union {
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:20:5: note: a field of same name but different type is defined in another translation unit
   20 |     union {
      |     ^
/var/tmp/portage/media-libs/embree-4.3.1/work/embree-4.3.1/kernels/bvh/../common/../../common/sys/../math/vec3.h:20:11: note: type ‘union <anon>’ itself violates the C++ One Definition Rule
   20 |     union {
      |           ^
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/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

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