[Bug c++/67164] ICE: tree check:=?UTF-8?Q?=20expected=20class=20=E2=80=98expression=E2=80=99?=,=?UTF-8?Q?=20have=20=E2=80=98exceptional=E2=80=99=20?=(argument_pack_select) in tree_operand_check, at tree.h:3356

trippels at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sun Aug 23 10:09:00 GMT 2015


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

Markus Trippelsdorf <trippels at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org

--- Comment #3 from Markus Trippelsdorf <trippels at gcc dot gnu.org> ---
Here's another testcase: 

namespace std {
template <typename _Tp> struct A { static constexpr _Tp value = 0; };
template <bool, typename, typename> struct conditional;
template <typename...> struct B;
template <typename _B1, typename _B2>
struct B<_B1, _B2> : conditional<1, _B1, _B2> {};
template <typename...> struct C;
template <typename _B1, typename _B2>
struct C<_B1, _B2> : conditional<1, _B2, _B1> {};
template <typename> struct D;
template <typename _Tp> struct I : B<A<bool>, D<_Tp>>::type {};
template <typename _Tp> _Tp declval();
struct F {
  template <typename _Tp, typename _Arg,
            typename = decltype(_Tp(declval<_Arg>()))>
  static A<bool> __test(int);
};
template <typename _Tp, typename _Arg> struct J : F {
  decltype(__test<_Tp, _Arg>(0)) type;
};
template <typename _Tp, typename _Arg> struct K : C<int, J<_Tp, _Arg>> {};
template <typename _Tp, typename _Arg>
struct L : conditional<I<_Tp>::value, int, K<_Tp, _Arg>> {};
template <typename _Tp, typename _Arg>
struct __is_direct_constructible : L<_Tp, _Arg>::type {};
template <typename...> struct G;
template <typename _Tp, typename _Arg>
struct G<_Tp, _Arg> : __is_direct_constructible<_Tp, _Arg> {};
template <typename _Tp, typename... _Args>
struct is_constructible : G<_Tp, _Args...>::type {};
template <bool> struct enable_if;
template <bool, typename _Iftrue, typename> struct conditional {
  typedef _Iftrue type;
};
template <typename _Iftrue, typename _Iffalse>
struct conditional<false, _Iftrue, _Iffalse> {
  typedef _Iffalse type;
};
}
namespace detail {
template <bool> struct fast_and;
template <typename... Xn> struct closure {
  template <typename... Yn,
            typename = std::enable_if<
                fast_and<std::is_constructible<Xn, Yn>::value...>::value>>
  closure(Yn...);
  template <typename... Yn> closure(closure<Yn...>);
};
}
template <typename> struct make_impl;
template <typename Datatype> struct H {
  template <typename... X> decltype(auto) operator()(X... x) {
    return make_impl<Datatype>::apply(x...);
  }
};
template <typename Datatype> H<Datatype> make;
struct Tuple;
template <typename... Xs> struct M : detail::closure<Xs...> {
  using detail::closure<Xs...>::closure;
};
template <> struct make_impl<Tuple> {
  template <typename... Xs> static M<Xs...> apply(Xs...);
};
namespace test {
struct {
  template <typename... Xs> decltype(auto) operator()(Xs... xs) {
    auto storage = make<Tuple>(xs...);
    return storage;
  }
} seq;
}
int main() { test::seq(test::seq()); }



More information about the Gcc-bugs mailing list