https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117858
Bug ID: 117858 Summary: [15 regression] openrct2-0.4.16 fails to build (optional:823:52: error: incomplete type ‘std::__converts_from_optional<Focus, Focus>’ used in nested name specifier) Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: sjames at gcc dot gnu.org Target Milestone: --- ``` $ g++ ./CMakeFiles/openrct2.dir/src/openrct2-ui/windows/Staff.cpp.ii -std=gnu++20 -march=znver2 -fno-char8_t In file included from /var/tmp/portage/games-simulation/openrct2-0.4.16/work/OpenRCT2-0.4.16/src/openrct2-ui/../openrct2/interface/../localisation/../core/Guard.hpp:13, from /var/tmp/portage/games-simulation/openrct2-0.4.16/work/OpenRCT2-0.4.16/src/openrct2-ui/../openrct2/interface/../localisation/Formatter.h:13, from /var/tmp/portage/games-simulation/openrct2-0.4.16/work/OpenRCT2-0.4.16/src/openrct2-ui/../openrct2/interface/Window.h:14, from /var/tmp/portage/games-simulation/openrct2-0.4.16/work/OpenRCT2-0.4.16/src/openrct2-ui/windows/../interface/Theme.h:13, from /var/tmp/portage/games-simulation/openrct2-0.4.16/work/OpenRCT2-0.4.16/src/openrct2-ui/windows/Staff.cpp:10: /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/optional: In instantiation of ‘constexpr const bool std::optional<Focus>::__construct_from_contained_value<Focus, Focus>’: /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/optional:881:7: required by substitution of ‘template<class _Up> requires !(is_same_v<std::optional<_Tp>, typename std::remove_cvref<_It2>::type>) && (is_constructible_v<_Tp, const _Up&>) && (__construct_from_contained_value<_Up, typename std::remove_cv< <template-parameter-1-1> >::type>) constexpr std::optional<Focus>::optional(const std::optional<_Tp>&) [with _Up = Focus]’ 881 | && __construct_from_contained_value<_Up> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/type_traits:1143:25: required by substitution of ‘template<class _Tp, class ... _Args> using std::__is_constructible_impl = std::__bool_constant<__is_constructible(_Tp, _Args ...)> [with _Tp = Focus; _Args = {std::optional<Focus>&}]’ 1143 | = __bool_constant<__is_constructible(_Tp, _Args...)>; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/type_traits:1148:12: required from ‘struct std::is_constructible<Focus, std::optional<Focus>&>’ 1148 | struct is_constructible | ^~~~~~~~~~~~~~~~ /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/type_traits:181:35: required by substitution of ‘template<class ... _Bn> std::__detail::__first_t<std::integral_constant<bool, false>, typename std::enable_if<(!(bool)(_Bn::value)), void>::type ...> std::__detail::__or_fn(int) [with _Bn = {std::is_constructible<Focus, std::optional<Focus>&>, std::is_convertible<std::optional<Focus>&, Focus>, std::is_constructible<Focus, std::optional<Focus> >, std::is_convertible<std::optional<Focus>, Focus>, std::is_constructible<Focus, const std::optional<Focus>&>, std::is_convertible<const std::optional<Focus>&, Focus>, std::is_constructible<Focus, const std::optional<Focus> >, std::is_convertible<const std::optional<Focus>, Focus>}]’ 181 | __enable_if_t<!bool(_Bn::value)>...>; | ^~~~~ /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/type_traits:199:41: required from ‘struct std::__or_<std::is_constructible<Focus, std::optional<Focus>&>, std::is_convertible<std::optional<Focus>&, Focus>, std::is_constructible<Focus, std::optional<Focus> >, std::is_convertible<std::optional<Focus>, Focus>, std::is_constructible<Focus, const std::optional<Focus>&>, std::is_convertible<const std::optional<Focus>&, Focus>, std::is_constructible<Focus, const std::optional<Focus> >, std::is_convertible<const std::optional<Focus>, Focus> >’ 199 | : decltype(__detail::__or_fn<_Bn...>(0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~ /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/optional:1083:45: required by substitution of ‘template<class _Up> requires !(is_same_v<std::optional<_Tp>, typename std::remove_cvref<_It2>::type>) && (is_constructible_v<_Tp, _Up>) && (is_assignable_v<_Tp&, _Up>) && !(std::__converts_from_optional<_Tp, _From>::value) && !(std::__assigns_from_optional<_Tp, _Up>::value) constexpr std::optional<Focus>& std::optional<Focus>::operator=(std::optional<_Tp>&&) [with _Up = Focus]’ 1083 | && (!__converts_from_optional<_Tp, _Up>::value) | ^~~~~ /var/tmp/portage/games-simulation/openrct2-0.4.16/work/OpenRCT2-0.4.16/src/openrct2-ui/windows/Staff.cpp:1168:21: required from here 1168 | focus = tempFocus; | ^~~~~~~~~ /usr/lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/optional:823:52: error: incomplete type ‘std::__converts_from_optional<Focus, Focus>’ used in nested name specifier 823 | = !__converts_from_optional<_Tp, _From>::value; | ^~~~~ ```