On 02/16/2018 07:04 AM, Jason Merrill wrote:
On Thu, Feb 15, 2018 at 6:36 PM, Martin Sebor <mse...@gmail.com> wrote:
A failed template deduction in template member of a template
triggers an ICE with -std=c++17 due to what seems like
a missing handling of invalid input. Replacing
the gcc_unreachable() call that causes the ICE with a return
statement indicating the deduction failure eliminates the ICE
and restores sane diagnostics.
Hmm, we really shouldn't have gotten there; that assert is checking
that when we see a TEMPLATE_*_PARM node in the template signature, it
corresponds to one of the actual parms of the template. Sounds like
something is going wrong in build_deduction_guide.
Are you suggesting that build_deduction_guide should fail somehow
(it's not expected to fail right now) or that the guide it creates
is wrong? It returns this for the test case in the bug (below):
template<int I> B(A<T>::B<I>)-> A<T>::B<I>
If I make B a template with a type argument it returns this:
template<class U> B(A<T>::B<U>)-> A<T>::B<U>
The test case is accepted then.
Martin
template<typename T> struct A
{
template<int> struct B
{
B(T);
};
A() { B b(0); }
};
A<int> a;