[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