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;
| ^~~~~
```