Created attachment 41038 [details] Example that a tuple of a variant can't be constructed Hi gcc-team, first of all, I'm not sure if this bug(?) should be filed here. If not please move it to the correct component. I currently was trying to create a constexpr tuple of a constexpr variant as value, which apparently doesn't work, even though I can create a constexpr variant. I get the following error: ``` In file included from bug_gcc_constexpr_tuple_of_variant.cpp:2:0: /usr/local/bin/gcc-7/include/c++/7.0.1/tuple: In function ‘int main()’: bug_gcc_constexpr_tuple_of_variant.cpp:8:51: in constexpr expansion of ‘std::make_tuple(_Elements&& ...) [with _Elements = {const std ::variant<unsigned char, short unsigned int, unsigned int>&}]()’ bug_gcc_constexpr_tuple_of_variant.cpp:8:51: in constexpr expansion of ‘std::tuple<std::variant<unsigned char, short unsigned int, un signed int> >(std::forward<const std::variant<unsigned char, short unsigned int, unsigned int>&>(__args#0))’ /usr/local/bin/gcc-7/include/c++/7.0.1/tuple:609:33: in constexpr expansion of ‘((std::tuple<std::variant<unsigned char, short unsign ed int, unsigned int> >*)this)->std::tuple<std::variant<unsigned char, short unsigned int, unsigned int> >::<anonymous>.std::_Tuple_imp l<0, std::variant<unsigned char, short unsigned int, unsigned int> >::_Tuple_impl(__elements#0)’ /usr/local/bin/gcc-7/include/c++/7.0.1/tuple:361:21: error: ‘constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [w ith long unsigned int _Idx = 0; _Head = std::variant<unsigned char, short unsigned int, unsigned int>]’ called in a constant expression : _Base(__head) { } ^ /usr/local/bin/gcc-7/include/c++/7.0.1/tuple:125:17: note: ‘constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [wi th long unsigned int _Idx = 0; _Head = std::variant<unsigned char, short unsigned int, unsigned int>]’ is not usable as a constexpr fun ction because: constexpr _Head_base(const _Head& __h) ^~~~~~~~~~ /usr/local/bin/gcc-7/include/c++/7.0.1/tuple:126:25: error: call to non-constexpr function ‘std::variant<_Types>::variant(const std::va riant<_Types>&) [with _Types = {unsigned char, short unsigned int, unsigned int}]’ : _M_head_impl(__h) { } ^ In file included from bug_gcc_constexpr_tuple_of_variant.cpp:3:0: /usr/local/bin/gcc-7/include/c++/7.0.1/variant:932:7: note: ‘std::variant<_Types>::variant(const std::variant<_Types>&) [with _Types = {unsigned char, short unsigned int, unsigned int}]’ is not usable as a constexpr function because: variant(const variant&) = default; ^~~~~~~ /usr/local/bin/gcc-7/include/c++/7.0.1/variant:399:7: note: defaulted constructor calls non-constexpr ‘std::__detail::__variant::_Varia nt_base<_Types>::_Variant_base(const std::__detail::__variant::_Variant_base<_Types>&) [with _Types = {unsigned char, short unsigned in t, unsigned int}]’ _Variant_base(const _Variant_base& __rhs) ^~~~~~~~~~~~~ zsh: exit 1 g++-7 -std=c++1z -Wall -Wextra bug_gcc_constexpr_tuple_of_variant.cpp ``` Maybe you can tell me what I'm doing wrong. Best regards marehr
Ville said on IRC that this issue unfortunately cannot be fix for gcc-7. It will have to wait 'till gcc-8.
Hmm, might be that this can be made to work before gcc 7 ships, since it's apparently just a variant copy/move constructor issue.
Same with clang, and I found the reason: Since the first argument is std::vector, the function std::apply is called instead of my apply function … So it's not a bug. But maybe you can add some kind hint for such errors in the compiler frontend.
Sorry, wrong thread!
GCC 8.1 has been released.
This is fixed in GCC 8.1 and not going to be backported to gcc-7-branch.
This was fixed by r249706 *** This bug has been marked as a duplicate of bug 80187 ***
Author: ville Date: Sun May 13 10:36:12 2018 New Revision: 260209 URL: https://gcc.gnu.org/viewcvs?rev=260209&root=gcc&view=rev Log: PR libstdc++/80165 * testsuite/20_util/variant/80165.cc: New. Added: trunk/libstdc++-v3/testsuite/20_util/variant/80165.cc Modified: trunk/libstdc++-v3/ChangeLog