[cfe-dev] [Possible regression?] Canonical decl of friend template decls in dependent contexts
Vassil Vassilev via cfe-dev
cfe-dev at lists.llvm.org
Fri Oct 13 02:02:41 PDT 2017
On 13/10/17 00:17, slycelote wrote:
> Consider the following:
>
>
> template<typename T>
> struct C; // d1
>
> template<typename T>
> class D {
> static void f() {}
>
> template<typename>
> friend struct C; // d2
> };
>
> template<typename T>
> struct C { }; // d3
>
> int main() { }
>
>
> Here there are 3 declarations corresponding to class template C (marked
> as d1, d2 and d3).
>
> In clang 3.9 getCanonicalDecl() for all 3 of them returns d1. Starting
> from clang 4.0, d2->getCanonicalDecl() == d2. As far as I can tell, this
> is caused by commit 291753 [1].
That was intentional because keeping friend declarations in the
redecl chain confuses the template instantiator. That's visible
especially with modules.
>
> Is this intended? It looks to me, that, for example,
> clang::declaresSameEntity(d1, d2) [2] will return a wrong result.
Richard, would it be feasible to not add the fiend decl to the redecl
chain but to still rewire it to the 'right' canonical decl. That way
getMostRecentDecl() won't return d2 (in some cases) and
declaresSameEntity(d1,d2) will return true?
>
>
> [1] https://llvm.org/viewvc/llvm-project?view=revision&revision=291753
> [2]
> https://clang.llvm.org/doxygen/namespaceclang.html#ad9d926b16adbdbc93705737b69d47cae
>
>
More information about the cfe-dev
mailing list