Skip to content

[libc++] Cannot call std::visit with immediate lambda visitor #118560

Open
@LHLaurini

Description

@LHLaurini

This code

#include <variant>

consteval auto func(const std::variant<int>& value) {
    return std::visit([](auto val) consteval { return val; }, value);
}

Compiles with both GCC and Clang + stdlibc++. However, it fails to compile with Clang + libc++.

In file included from <source>:2:
/opt/compiler-explorer/clang-trunk-20241203/bin/../include/c++/v1/variant:497:20: error: constexpr variable '__fmatrix' must be initialized by a constant expression
  497 |     constexpr auto __fmatrix = __make_fmatrix<_Visitor&&, decltype(std::forward<_Vs>(__vs).__as_base())...>();
      |                    ^           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/compiler-explorer/clang-trunk-20241203/bin/../include/c++/v1/variant:583:20: note: in instantiation of function template specialization 'std::__variant_detail::__visitation::__base::__visit_alt<std::__variant_detail::__visitation::__variant::__value_visitor<(lambda at <source>:5:23)>, const std::__variant_detail::__impl<int> &>' requested here
  583 |     return __base::__visit_alt(
      |                    ^
/opt/compiler-explorer/clang-trunk-20241203/bin/../include/c++/v1/variant:595:12: note: in instantiation of function template specialization 'std::__variant_detail::__visitation::__variant::__visit_alt<std::__variant_detail::__visitation::__variant::__value_visitor<(lambda at <source>:5:23)>, const std::variant<int> &>' requested here
  595 |     return __visit_alt(__make_value_visitor(std::forward<_Visitor>(__visitor)), std::forward<_Vs>(__vs)...);
      |            ^
/opt/compiler-explorer/clang-trunk-20241203/bin/../include/c++/v1/variant:1566:21: note: in instantiation of function template specialization 'std::__variant_detail::__visitation::__variant::__visit_value<(lambda at <source>:5:23), const std::variant<int> &>' requested here
 1566 |   return __variant::__visit_value(std::forward<_Visitor>(__visitor), std::forward<_Vs>(__vs)...);
      |                     ^
<source>:5:17: note: in instantiation of function template specialization 'std::visit<(lambda at <source>:5:23), const std::variant<int> &, void>' requested here
    5 |     return std::visit([](auto val) consteval { return val; }, value);
      |                 ^
/opt/compiler-explorer/clang-trunk-20241203/bin/../include/c++/v1/variant:497:20: note: pointer to a consteval declaration is not a constant expression
  497 |     constexpr auto __fmatrix = __make_fmatrix<_Visitor&&, decltype(std::forward<_Vs>(__vs).__as_base())...>();
      |                    ^
/opt/compiler-explorer/clang-trunk-20241203/bin/../include/c++/v1/variant:529:59: note: declared here
  529 |     _LIBCPP_HIDE_FROM_ABI static constexpr decltype(auto) __dispatch(_Fp __f, _Vs... __vs) {
      |                                                           ^
1 error generated.
Compiler returned: 1

Demo on Compiler Explorer. Interestingly, MSVC also has trouble with this example (read outside lifetime, for some reason).

Metadata

Metadata

Assignees

No one assigned

    Labels

    constevalC++20 constevallibc++libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.needs-reductionLarge reproducer that should be reduced into a simpler form

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions