public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/111089] New: ODR violation warning in std::variant implementation when linking(LTO) C++20 and C++17 TUs
@ 2023-08-21 12:00 damian.jarek93 at gmail dot com
  2023-08-21 18:57 ` [Bug libstdc++/111089] " pinskia at gcc dot gnu.org
  0 siblings, 1 reply; 2+ messages in thread
From: damian.jarek93 at gmail dot com @ 2023-08-21 12:00 UTC (permalink / raw)
  To: gcc-bugs

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.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Bug libstdc++/111089] ODR violation warning in std::variant implementation when linking(LTO) C++20 and C++17 TUs
  2023-08-21 12:00 [Bug c++/111089] New: ODR violation warning in std::variant implementation when linking(LTO) C++20 and C++17 TUs damian.jarek93 at gmail dot com
@ 2023-08-21 18:57 ` pinskia at gcc dot gnu.org
  0 siblings, 0 replies; 2+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-08-21 18:57 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
libstdc++'s c++20 version of _Uninitialized:
      struct _Empty_byte { };

      union {
 _Empty_byte _M_empty;
 _Type _M_storage;
      };

c++17 version:
      __gnu_cxx::__aligned_membuf<_Type> _M_storage;


That is techincally a ODR violation ...


How to reproduce using regular sources (rather than preprocessed sources).
main.cc:
```
#include <variant>
#include <string>
#include <cstdint>

void test(std::variant<std::string, std::uint32_t> id);

int main()
{
    test("123");
}
```
t.cc:
```
#include <variant>
#include <string>
#include <cstdint>


void test(std::variant<std::string, std::uint32_t> id)
{
    __builtin_printf("%d\n", (int)(id.index()));
}
```

$ ~/upstream-gcc/bin/g++ t.cc -std=gnu++20 -c -flto
$ ~/upstream-gcc/bin/g++ main.cc -std=gnu++17 -c -flto
$ ~/upstream-gcc/bin/g++ main.o t.o   -flto
main.cc:5:6: warning: ‘test’ violates the C++ One Definition Rule [-Wodr]
    5 | void test(std::variant<std::string, std::uint32_t> id);
      |      ^
t.cc:6:6: note: type mismatch in parameter 1
    6 | void test(std::variant<std::string, std::uint32_t> id)
      |      ^
/home/apinski/upstream-gcc/include/c++/14.0.0/variant:1337:11: note: type
‘struct variant’ itself violates the C++ One Definition Rule
 1337 |     class variant
      |           ^
t.cc:6:6: note: ‘test’ was previously declared here
    6 | void test(std::variant<std::string, std::uint32_t> id)
      |      ^

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-08-21 18:57 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-21 12:00 [Bug c++/111089] New: ODR violation warning in std::variant implementation when linking(LTO) C++20 and C++17 TUs damian.jarek93 at gmail dot com
2023-08-21 18:57 ` [Bug libstdc++/111089] " pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).