https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86356

            Bug ID: 86356
           Summary: "invalid use of pack expansion" with fold expressions
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pdimov at gmail dot com
  Target Milestone: ---

The code

```
#include <type_traits>

template<bool B> using mp_bool = std::integral_constant<bool, B>;

template<class... T> using mp_all = mp_bool<(static_cast<bool>(T::value) &&
...)>;
template<class... T> using mp_any = mp_bool<(static_cast<bool>(T::value) ||
...)>;

template<bool is_trivially_destructible, bool is_single_buffered, class... T>
struct variant_base_impl {};
template<class... T> using variant_base =
variant_base_impl<mp_all<std::is_trivially_destructible<T>...>::value,
mp_any<mp_all<std::is_nothrow_move_constructible<T>...>,
std::is_nothrow_default_constructible<T>...>::value, T...>;

int main()
{
        variant_base<void, int, float>();
}
```

yields with g++ 7.3 (and 8.1)

```
testbed2017.cpp: In substitution of 'template<class ... T> using variant_base =
variant_base_impl<std::integral_constant<bool,
(static_cast<bool>(std::is_trivially_destructible<T>::value)  && ...)>::value,
std::integral_constant<bool, (static_cast<bool>(std::integral_constant<bool,
(static_cast<bool>(std::is_nothrow_move_constructible<T>::value)  &&
...)>::value) ||
static_cast<bool>(std::is_nothrow_default_constructible<T>::value)
...)>::value, T ...> [with T = {void, int, float}]':
testbed2017.cpp:13:31:   required from here
testbed2017.cpp:6:82: error: invalid use of pack expansion expression
 template<class... T> using mp_any = mp_bool<(static_cast<bool>(T::value) ||
...)>;

  ^
```

clang++ accepts.

Reply via email to