https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105683
Bug ID: 105683 Summary: [12 Regression] Infinite loop with construction of vector of variant Product: gcc Version: 12.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jeanmichael.celerier at gmail dot com Target Milestone: --- Created attachment 53012 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53012&action=edit Full repro Hello, Full repro attached (g++ -std=gnu++20 repro.cpp && ./a.out is enough to trigger the issue). Same code works fine for every GCC version < 12 in c++17, c++20, as well as with every released clang version in c++17, c++20, with both libc++ and libstdc++. My code more-or-less looks like this (trying to keep only the relevant parts): // line 58584 struct value_variant_type { union Impl { std::vector<ossia::value> m_value8; } m_impl; value_variant_type(const std::vector<ossia::value>& v); value_variant_type(std::vector<ossia::value>&& v); }; // line 58681 class value { value_variant_type v; value(const std::vector<ossia::value>& val) noexcept : v{val} { } explicit value(std::vector<ossia::value>&& val) noexcept : v{std::move(val)} { } }; // line 75925 inline value_variant_type::value_variant_type(const std::vector<ossia::value>& v) : m_type{Type8} { new (&m_impl.m_value8) std::vector<ossia::value>(v); } inline value_variant_type::value_variant_type(std::vector<ossia::value>&& v) : m_type{Type8} { new (&m_impl.m_value8) std::vector<ossia::value>(std::move(v)); } // line 58916 inline ossia::value init_value(ossia::val_type type) { return std::vector<ossia::value>{}; } // line 76232 void create_value_inline(ossia::value& v, ossia::val_type t) { v = ossia::init_value(t); } int main() { ossia::value v; create_value_inline(v, ossia::val_type::LIST); } What it looks that is happening is a loop between the construction of the value and of the vector: #1822 0x00005555555587b7 in ossia::value::value (other=..., this=0x555555abff10) at /home/jcelerier/ossia/score/3rdparty/libossia/src/ossia/network/value/value.hpp:302 #1823 std::_Construct<ossia::value, ossia::value const&> (__p=0x555555abff10) at /usr/include/c++/12.1.0/bits/stl_construct.h:119 #1824 std::__do_uninit_copy<ossia::value const*, ossia::value*> (__result=<optimized out>, __last=<optimized out>, __first=0x7fffff802a50) at /usr/include/c++/12.1.0/bits/stl_uninitialized.h:120 #1825 std::__uninitialized_copy<false>::__uninit_copy<ossia::value const*, ossia::value*> (__result=<optimized out>, __last=<optimized out>, __first=<optimized out>) at /usr/include/c++/12.1.0/bits/stl_uninitialized.h:137 #1826 std::uninitialized_copy<ossia::value const*, ossia::value*> (__result=<optimized out>, __last=<optimized out>, __first=<optimized out>) at /usr/include/c++/12.1.0/bits/stl_uninitialized.h:185 #1827 std::__uninitialized_copy_a<ossia::value const*, ossia::value*, ossia::value> (__result=0x555555abff10, __last=0x7fffff802a78, __first=0x7fffff802a50) at /usr/include/c++/12.1.0/bits/stl_uninitialized.h:372 #1828 std::vector<ossia::value, std::allocator<ossia::value> >::_M_range_initialize<ossia::value const*> (__last=0x7fffff802a78, __first=0x7fffff802a50, this=0x555555abfee0) at /usr/include/c++/12.1.0/bits/stl_vector.h:1690 #1829 std::vector<ossia::value, std::allocator<ossia::value> >::vector (__a=..., Python Exception <class 'gdb.error'>: value has been optimized out __l=, this=0x555555abfee0) at /usr/include/c++/12.1.0/bits/stl_vector.h:677 #1830 ossia::value_variant_type::value_variant_type (other=..., this=0x555555abfee0) at /home/jcelerier/ossia/score/3rdparty/libossia/src/ossia/network/value/value_variant_impl.hpp:17017 #1831 ossia::value::value (other=..., this=0x555555abfee0) at /home/jcelerier/ossia/score/3rdparty/libossia/src/ossia/network/value/value.hpp:302