https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111089

            Bug ID: 111089
           Summary: ODR violation warning in std::variant implementation
                    when linking(LTO) C++20 and C++17 TUs
           Product: gcc
           Version: 12.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: damian.jarek93 at gmail dot com
  Target Milestone: ---

Created attachment 55770
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=55770&action=edit
ii files of a minimal example that reproduces the issue

When 2 TUs are LTO-linked, g++ complains about an ODR violation in
std::variant's implementation:

/usr/bin/g++-12 -flto -Wall -Wextra -g -flto=auto -fno-fat-lto-objects
CMakeFiles/main.dir/main.cpp.o -o main  libcxx17-lib.a 
/usr/include/c++/12/variant:244:12: note: type 'struct _Uninitialized' itself
violates the C++ One Definition Rule
  244 |     struct _Uninitialized<_Type, false>
      |            ^
/usr/include/c++/12/variant:378:11: note: type 'union _Variadic_union' itself
violates the C++ One Definition Rule
  378 |     union _Variadic_union<_First, _Rest...>
      |           ^
/workspaces/odr-bug-repro/cxx17.hpp:8:6: warning: 'test' violates the C++ One
Definition Rule [-Wodr]
    8 | void test(std::variant<std::string, std::uint32_t> id);
      |      ^
/workspaces/odr-bug-repro/cxx17.cpp:5:6: note: type mismatch in parameter 1
    5 | void test(std::variant<std::string, std::uint32_t> id)
      |      ^
/usr/include/c++/12/variant:1336:11: note: type 'struct variant' itself
violates the C++ One Definition Rule
 1336 |     class variant
      |           ^
/workspaces/odr-bug-repro/cxx17.cpp:5:6: note: 'test' was previously declared
here
    5 | void test(std::variant<std::string, std::uint32_t> id)
      | 




The function 'void test(std::variant<std::string, std::uint32_t> id)' must be 
defined in a TU compiled with -std=gnu++17 and called in a TU compiled with 
-std=gnu++20.


Complete command line that reproduces the issue:
/usr/bin/g++-12 -std=gnu++20  -flto -Wall -Wextra -g -o main.cpp.o -c main.cpp
/usr/bin/g++-12 -std=gnu++17  -flto -Wall -Wextra -g -o cxx17.cpp.o -c
cxx17.cpp
/usr/bin/g++-12 -flto -Wall -Wextra -g -flto=auto -fno-fat-lto-objects
main.cpp.o cxx17.cpp.o -o main 



g++ version:
Using built-in specs.
COLLECT_GCC=g++-12
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/12/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
12.3.0-1ubuntu1~22.04' --with-bugurl=file:///usr/share/doc/gcc-12/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with-gcc-major-version-only --program-suffix=-12
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin
--enable-default-pie --with-system-zlib --enable-libphobos-checking=release
--with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch
--disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-12-ALHxjy/gcc-12-12.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-12-ALHxjy/gcc-12-12.3.0/debian/tmp-gcn/usr
--enable-offload-defaulted --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.3.0 (Ubuntu 12.3.0-1ubuntu1~22.04)



I also tested this bug  with g++ 13.1.0 and is still present there, although
the warning is slightly less verbose.
  • [Bug c++/111089] New: ODR vio... damian.jarek93 at gmail dot com via Gcc-bugs

Reply via email to