public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/99684] New: [modules] std::visit fails to compile when <variant> is used as header unit
@ 2021-03-20 18:28 wangsw.a at gmail dot com
  2021-03-30  1:33 ` [Bug c++/99684] " mpolacek at gcc dot gnu.org
  2024-03-07 20:44 ` ppalka at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: wangsw.a at gmail dot com @ 2021-03-20 18:28 UTC (permalink / raw)
  To: gcc-bugs

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

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

* [Bug c++/99684] [modules] std::visit fails to compile when <variant> is used as header unit
  2021-03-20 18:28 [Bug c++/99684] New: [modules] std::visit fails to compile when <variant> is used as header unit wangsw.a at gmail dot com
@ 2021-03-30  1:33 ` mpolacek at gcc dot gnu.org
  2024-03-07 20:44 ` ppalka at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2021-03-30  1:33 UTC (permalink / raw)
  To: gcc-bugs

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

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2021-03-30
                 CC|                            |mpolacek at gcc dot gnu.org
             Status|UNCONFIRMED                 |NEW

--- Comment #1 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Reproduced.  The error is:

/home/mpolacek/x/trunk/x86_64-pc-linux-gnu/libstdc++-v3/include/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)>,
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

* [Bug c++/99684] [modules] std::visit fails to compile when <variant> is used as header unit
  2021-03-20 18:28 [Bug c++/99684] New: [modules] std::visit fails to compile when <variant> is used as header unit wangsw.a at gmail dot com
  2021-03-30  1:33 ` [Bug c++/99684] " mpolacek at gcc dot gnu.org
@ 2024-03-07 20:44 ` ppalka at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: ppalka at gcc dot gnu.org @ 2024-03-07 20:44 UTC (permalink / raw)
  To: gcc-bugs

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

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |ppalka at gcc dot gnu.org
   Target Milestone|---                         |11.0
         Resolution|---                         |FIXED

--- Comment #2 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Seems to have been fixed for GCC 11.

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

end of thread, other threads:[~2024-03-07 20:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-20 18:28 [Bug c++/99684] New: [modules] std::visit fails to compile when <variant> is used as header unit wangsw.a at gmail dot com
2021-03-30  1:33 ` [Bug c++/99684] " mpolacek at gcc dot gnu.org
2024-03-07 20:44 ` ppalka 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).