zyn0217 wrote:

Thanks for the prompt review.

> There is an ambiguous case that I'm a little concerned about: if the alias 
> template parameter and the underlying template parameter have the same name, 
> the synthesized deduction guide may end up with two template parameters with 
> the same name. For instance, see [this 
> example](https://godbolt.org/z/q1n7Edzcz). In such cases, we cannot 
> distinguish between the `T1` parameters from the function signature `auto 
> (T1, T1) -> X<T1, double>`.

Yeah, this is indeed an interesting case. I played it a bit and realized we 
would now dump a confusing diagnostic for it:

```cpp
template <class T, class U>
struct X {
  X(T, U);
};

template <class T, class T1>
X(T, T1) -> X<T, double>;

template <class T1>
using AX = X<T1, double>;

AX s(1);
```
would result in
```
note: candidate function template not viable: requires 2 arguments, but 1 was 
provided
note: implicit deduction guide declared as 'template <class T1, class T1> 
requires __is_deducible(AX, X<type-parameter-0-0, double>) 
AX(type-parameter-0-0, type-parameter-0-1) -> X<type-parameter-0-0, double>'
```

The printed template parameter list is actually syntactically illegal simply 
because we merely dump the synthesized parameter list, which actually reuses 
the written parameter names. I think a solution would be, if we realize there's 
a name clash when building up a list, we make up and use a different parameter 
name. (This can be left as a follow-up because I feel we're less likely to run 
into this case.)

Regarding the disambiguation, we could already do that through an AST dump. For 
the case above, I ran an AST dump locally and got the following:


```
|-FunctionTemplateDecl 0x7f90695f3970 <line:9:1, line:10:24> col:1 implicit 
<deduction guide for AX>
| |-TemplateTypeParmDecl 0x7f90695f3068 <line:9:11, col:17> col:17 class depth 
0 index 0 T1
| |-TypeTraitExpr 0x7f90695f3858 <line:10:1> 'bool' __is_deducible
| | |-DeducedTemplateSpecializationType 0x7f90695f2e60 'AX' dependent
| | | `-name: 'AX'
| | |   `-TypeAliasTemplateDecl 0x7f90695f1d70 <line:9:1, line:10:24> col:1 AX
| | `-TemplateSpecializationType 0x7f90695f35a0 'X<T1, double>' dependent
| |   |-name: 'X' qualified
| |   | `-ClassTemplateDecl 0x7f90695ce158 <line:1:1, line:4:1> line:2:8 X
| |   |-TemplateArgument type 'T1':'type-parameter-0-0'
| |   | `-SubstTemplateTypeParmType 0x7f90695f32d0 'T1' sugar dependent class 
depth 0 index 0 T
| |   |   |-FunctionTemplate 0x7f90695f18d0 '<deduction guide for X>'
| |   |   `-TemplateTypeParmType 0x7f90695f30c0 'T1' dependent depth 0 index 0
| |   |     `-TemplateTypeParm 0x7f90695f3068 'T1'
| |   `-TemplateArgument type 'double'
| |     `-SubstTemplateTypeParmType 0x7f90695f3320 'double' sugar class depth 0 
index 1 U
| |       |-FunctionTemplate 0x7f90695f18d0 '<deduction guide for X>'
| |       `-BuiltinType 0x7f906957d780 'double'
| `-CXXDeductionGuideDecl 0x7f90695f38a8 <line:9:1, line:10:24> col:1 implicit 
<deduction guide for AX> 'auto (X<T1, double>) -> X<T1, double>'
|   `-ParmVarDecl 0x7f90695f3438 <line:2:8> col:8 'X<T1, double>'
```

Note that we can see the `T1`'s canonical type at the node of 
`TemplateArgument`.

https://github.com/llvm/llvm-project/pull/99840
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to