jcsxky wrote:

@mizvekov After looking into the code, I think we should transform qualifier in 
TST. Consider the following code:
```cpp
template <typename T>
t1<T>::template t2<T> f1();

void f2() {
  f1<bool>();
}
```
`TemplateSpecializationType` of `t2` whose `Template` is a 
`QualifiedTemplateName`(`t1<T>::`) will be dependent if we didn't transform the 
qualifier since its qualifier and `DeclContext` are both dependent and it 
wouldn't be specialized in `Sema::CheckTemplateIdType` due to its name 
dependency. Transform the qualifier and rebuild the `TemplateName` as a 
`DependentTemplateName` is also consistent  with what it is before cpp20(`t2` 
is a `DependentTemplateName`) which needs a `typename` keyword(`typename 
t1<T>::template t2<T>`).
> The fact that this change somehow affects program semantics is still 
> unexpected and unexplained.

The case in `clang/test/SemaCXX/many-template-parameter-lists.cpp` is affected 
is because the qualifier didn't be transformed and we can't find the 
instantiation of the declaration(`X`) which will not happen after this patch. 
This case is also accepted by gcc. The other cases are expected or explained in 
the comments.

>If I had to take a guess, there is something wrong in the dependency 
>computation for the NNS. Have you checked that?

I didn't find some problems in dependency computation for the NNS.

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

Reply via email to