On Sun, Feb 18, 2018 at 11:39 PM, Jason Merrill <ja...@redhat.com> wrote:
> On Fri, Feb 16, 2018 at 4:33 PM, Martin Sebor <mse...@gmail.com> wrote:
>> 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?
>
> The latter.  Maybe we're handling T wrong somehow?  We shouldn't be
> trying to deduce it.  In fact, we probably shouldn't be trying to
> deduce arguments for 'b' until we instantiate A.

Looks like the problem is that when we substitute into the
TEMPLATE_TYPE_PARM representing 'B' in the function, we don't touch
CLASS_PLACEHOLDER_TEMPLATE:

                    else if (tree pl = CLASS_PLACEHOLDER_TEMPLATE (t))
                      {
                        if (DECL_TEMPLATE_TEMPLATE_PARM_P (pl))
                          pl = tsubst (pl, args, complain, in_decl);
                        CLASS_PLACEHOLDER_TEMPLATE (r) = pl;
                      }

This code is failing to replace A<T>::B with A<int>::B.

Jason

Reply via email to