ilya-biryukov wrote:
We are seeing some internal tests (and tools) failing because the canonical
declaration for template specializations has changed in cases like this:
```cpp
template <typename T>
void Foo(T target); // #1
template <typename T>
void Foo(T defn) {} // #2
template <>
void Foo(int specialization) {} // #3
```
a matcher
```cpp
functionDecl(
hasName("Foo"), isDefinition(),
hasParameter(
0, parmVarDecl(hasType(isInt()),
mostCanonicalDecl(parmVarDecl().bind("p")))))),
```
with `mostCanonicalDecl` implemented as
```cpp
if (const auto* param = clang::dyn_cast<clang::ParmVarDecl>(&Node)) {
if (const auto* parent = clang::dyn_cast_or_null<clang::FunctionDecl>(
Node.getParentFunctionOrMethod())) {
const clang::FunctionDecl* func = parent;
if (const auto* pattern = func->getTemplateInstantiationPattern()) {
// Traverse from the instantiation to the pattern.
func = pattern;
}
func = func->getCanonicalDecl();
if (parent != func) {
/* remap indicies and get the matching parameter*/
/* ... */
}
}
}
```
has previously returned `#1` when matching the specialization. Now it returns
`#2`.
Is this change in the canonical declaration intended?
https://github.com/llvm/llvm-project/pull/111852
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits