Open
Description
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).