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

            Bug ID: 99684
           Summary: [modules] std::visit fails to compile when <variant>
                    is used as header unit
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wangsw.a at gmail dot com
  Target Milestone: ---

All invocations of std::visit on variants currently fail a static_assert, when
<variant> is imported as a header unit.

Environment: gcc (GCC) 11.0.1 20210320 (experimental) [master branch],
configured with '--enable-languages=c,c++ --disable-multilib', built as docker
image on macOS 10.14.6
Dockerfile:
https://raw.githubusercontent.com/beanandbean/docker-gcc-cxx-modules/5fa616ae6c55bdb2c2961feff8d8ae5c51004961/Dockerfile
[with argument GCC_BRANCH=master]

-------- main.cpp --------

import <variant>;

int main() {
  std::variant<int, char> a;
  std::visit([](auto&&) {}, a);
  return 0;
}

------ command line ------

(in docker shell:)
root@1265897bf148:/project# g++ -std=c++20 -fmodules-ts -x c++-system-header
variant
root@1265897bf148:/project# g++ -std=c++20 -fmodules-ts -Wall -Wextra main.cpp
In module /usr/local/include/c++/11.0.1/variant, imported at main.cpp:1:
/usr/local/include/c++/11.0.1/variant: In instantiation of 'static constexpr
void
std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type
(*)(_Visitor, _Variants ...), __dimensions ...>, std::integer_sequence<long
unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&, _Tp*) [with bool
__do_cookie = false; long unsigned int __index = 0; _Tp =
std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&)>; _Result_type =
std::__detail::__variant::__deduce_visit_result<void>; _Visitor =
main()::<lambda(auto:1&&)>&&; long unsigned int ...__dimensions = {2};
_Variants = {std::variant<int, char>&}; long unsigned int ...__indices = {}]':
/usr/local/include/c++/11.0.1/variant:944:48:   required from 'constexpr const
_Array_type
std::__detail::__variant::__gen_vtable<std::__detail::__variant::__deduce_visit_result<void>,
main()::<lambda(auto:1&&)>&&, std::variant<int, char>&>::_S_vtable'
/usr/local/include/c++/11.0.1/variant:1711:45:   required from 'constexpr
decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type
= std::__detail::__variant::__deduce_visit_result<void>; _Visitor =
main()::<lambda(auto:1&&)>; _Variants = {std::variant<int, char>&}]'
/usr/local/include/c++/11.0.1/variant:1764:34:   required from 'constexpr
decltype(auto) std::visit(_Visitor&&, _Variants&& ...) [with _Visitor =
main()::<lambda(auto:1&&)>; _Variants = {std::variant<int, char>&}]'
main.cpp:5:30:   required from here
/usr/local/include/c++/11.0.1/variant:1052:67:   in 'constexpr' expansion of
'std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&), 2>,
std::integer_sequence<long unsigned int> >::_S_apply()'
/usr/local/include/c++/11.0.1/variant:929:19:   in 'constexpr' expansion of
'std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&), 2>,
std::integer_sequence<long unsigned int> >::_S_apply_all_alts<0, 1>(__vtable,
(std::make_index_sequence<2>(), std::make_index_sequence<2>()))'
/usr/local/include/c++/11.0.1/variant:966:29: error: static assertion failed:
std::visit requires the visitor to have the same return type for all
alternatives of a variant
  966 |               static_assert(is_same_v<_Tp, decltype(__tmp_element)>,
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/c++/11.0.1/variant:966:29: note:
'std::is_same_v<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&)>,
std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&)>&>' evaluates to
false
/usr/local/include/c++/11.0.1/variant: In instantiation of 'static constexpr
void
std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type
(*)(_Visitor, _Variants ...), __dimensions ...>, std::integer_sequence<long
unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&, _Tp*) [with bool
__do_cookie = false; long unsigned int __index = 1; _Tp =
std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&)>; _Result_type =
std::__detail::__variant::__deduce_visit_result<void>; _Visitor =
main()::<lambda(auto:1&&)>&&; long unsigned int ...__dimensions = {2};
_Variants = {std::variant<int, char>&}; long unsigned int ...__indices = {}]':
/usr/local/include/c++/11.0.1/variant:944:48:   required from 'constexpr const
_Array_type
std::__detail::__variant::__gen_vtable<std::__detail::__variant::__deduce_visit_result<void>,
main()::<lambda(auto:1&&)>&&, std::variant<int, char>&>::_S_vtable'
/usr/local/include/c++/11.0.1/variant:1711:45:   required from 'constexpr
decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type
= std::__detail::__variant::__deduce_visit_result<void>; _Visitor =
main()::<lambda(auto:1&&)>; _Variants = {std::variant<int, char>&}]'
/usr/local/include/c++/11.0.1/variant:1764:34:   required from 'constexpr
decltype(auto) std::visit(_Visitor&&, _Variants&& ...) [with _Visitor =
main()::<lambda(auto:1&&)>; _Variants = {std::variant<int, char>&}]'
main.cpp:5:30:   required from here
/usr/local/include/c++/11.0.1/variant:1052:67:   in 'constexpr' expansion of
'std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&), 2>,
std::integer_sequence<long unsigned int> >::_S_apply()'
/usr/local/include/c++/11.0.1/variant:929:19:   in 'constexpr' expansion of
'std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&), 2>,
std::integer_sequence<long unsigned int> >::_S_apply_all_alts<0, 1>(__vtable,
(std::make_index_sequence<2>(), std::make_index_sequence<2>()))'
/usr/local/include/c++/11.0.1/variant:966:29: error: static assertion failed:
std::visit requires the visitor to have the same return type for all
alternatives of a variant
/usr/local/include/c++/11.0.1/variant:966:29: note:
'std::is_same_v<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&)>,
std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<void>
(*)(main()::<lambda(auto:1&&)>&&, std::variant<int, char>&)>&>' evaluates to
false

Reply via email to