From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8411 invoked by alias); 18 May 2012 17:46:40 -0000 Received: (qmail 8249 invoked by uid 22791); 18 May 2012 17:46:38 -0000 X-SWARE-Spam-Status: No, hits=-3.5 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 18 May 2012 17:46:25 +0000 From: "ibugs at qult dot net" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/53403] New: Function template friend denied access to private types of granting template class. Date: Fri, 18 May 2012 17:48:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: ibugs at qult dot net X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Changed-Fields: Message-ID: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-05/txt/msg01847.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53403 Bug #: 53403 Summary: Function template friend denied access to private types of granting template class. Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned@gcc.gnu.org ReportedBy: ibugs@qult.net The following code compiles with GCC 4.4 but not since 4.5, until at least 4.7.0. template class Foo { typedef void type; template friend void f(); public: Foo() {} }; template class Foo; template void f() { typedef Foo::type type; } int main() { f(); } If the function template is declared before the definition of the class template, or if the Foo class is instantiated after f's definition, the code compiles. The error appears only with private types, not other private members. Easy to work around, but still... :/