[Bug c++/59930] template friend declarations, namespaces, and explicit instantiations don't mix

nathan at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Nov 22 16:01:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59930

--- Comment #2 from Nathan Sidwell <nathan at gcc dot gnu.org> ---
When we parse the template friend declaration, we're not injecting an invisible
template decl into the enclosing namespace.

When we instantiate the template we do an unqualified lookup (and ask for
hidden objects) from the enclosing namespace. 

In the first testcase, this fails to find anything.  Then we explicitly inject
into the global scope, as Richard surmised:
      /* The friend template has not already been declared.  In this
         case, the instantiation of the template class will cause the
         injection of this template into the global scope.  */
That just seems wrong.  Perhaps it was right at some point?

In the second testcase we perform the unqualified lookup, but find the ::B, as
it's declared at the point of the instantiation.  So we make it a friend.  Bah.

10.3.1.2/3 talks about invisible friend injection, and AFAICT doesn't prohibit
that happening during template parsing time.


More information about the Gcc-bugs mailing list