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

Reply via email to