[Bug c++/94489] ICE: unexpected expression ‘std::min’ of kind overload
mpolacek at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Apr 6 23:50:30 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94489
--- Comment #4 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
(In reply to Marek Polacek from comment #2)
> Doesn't seem like valid code; clang++ trunk also rejects it:
> 94489.C:28:61: error: no matching constructor for initialization of
> 'std::plus<void>'
>
> I think the fix should be
>
> --- a/gcc/cp/pt.c
> +++ b/gcc/cp/pt.c
> @@ -3748,6 +3748,7 @@ expand_integer_pack (tree call, tree args,
> tsubst_flags_t complain,
> }
> else
> {
> + hi = instantiate_non_dependent_expr_sfinae (hi, complain);
> hi = cxx_constant_value (hi);
> int len = valid_constant_size_p (hi) ? tree_to_shwi (hi) : -1;
>
>
> but it'd be nice to have a reduced version.
This is not a complete fix because this one ICEs even with that:
template <typename, int...> struct b;
template <typename T, T... d> using e = b<T, __integer_pack(d)...>;
template <unsigned d> using f = e<unsigned, d>;
template <typename T> constexpr long g(T) { return 1l; }
struct array { };
template <typename> constexpr unsigned h{};
template<typename T, long dim = g(h<T>), class X = decltype(f<dim>{})> struct k
{ int n; };
template<typename T, typename U>
auto m(T t, U)
{
[t] <unsigned> () {
m(array{}, array{});
return k<T, 1>::n;
};
}
More information about the Gcc-bugs
mailing list