zyn0217 wrote:

Sorry, it might be I forgot to save the changes before I ran the tests 
yesterday!

I looked into it again, and I think I have begun to understand 
`TemplateParameterListsInfo`:

The first intent is to describe out-of-line member functions that live in a 
templated scope. For example,

```cpp
template <class T>
struct S {
  void foo();
};

template <class T>
void S<T>::foo() {}
```

So the member function `foo`, which is *not* a template, doesn't have any 
associated template declaration, whereas it has a structure 
`TemplateParameterListsInfo` that describes its specifier `S<T>`.

However, for non-member function explicit specialization in question, 
`ActOnFunctionDeclarator()` would also set up its `TemplateParameterListsInfo` 
for the "spelled" explicit specialization, and wire up the "implicit" 
declaration to the "spelled" declaration, in the form of a redeclaration.

Seemingly we might fix the problem in `ActOnFunctionDeclarator()` (we shouldn't 
do that in `CheckFunctionTemplateSpecialization()` because that has more 
clients than `ActOnFunctionDeclarator()`, e.g. CXXMethod instantiator that we 
probably don't need to deal with.) and thereby we don't have to take care of 
these odd canonical declarations in `ASTContext::getRawCommentForAnyRedecl()`.

I tried that approach locally and now I have all check-clang tests passed but 
some of the check-clangd tests failed

```
Clangd :: include-cleaner-batch-fix.test
Clangd Unit Tests :: ./ClangdTests/DefineInlineTest/AddInline 
(DefineInlineTest.AddInline, around line 990)
```

I don't know if people already have some assumptions that an "implicit" 
explicit specialization shouldn't have its `TemplateParameterListsInfo`, though 
:(

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

Reply via email to