Following code does not compile with gcc 4.1. It compiles with gcc 3.4.0 and gcc 4.0.2 and comeau online. ============================= class A { private: enum private_enum {a}; template<A::private_enum v> // OK struct B { void bm(); }; public: void am() { B<a> instance; //OK instance.bm(); } }; template<A::private_enum v> // FAIL void A::B<v>::bm(){} ============================= The error message is: a.cc:4: error: 'enum A::private_enum' is private a.cc:19: error: within this context If the member template function gets defined inline, the code compiles. I don't have the c++ standard available, but a technicality like an inline/outline definition should have no impact on the validity of the code imho. The same error occurrs if the enum gets replaced by a function template typedef, or if the inner-class gets replaced by a member-function-template. A related bug is 10849
Confirmed. Janis, could you do a regression hunt on this bug? Thanks.
A regression hunt on powerpc-linux identified this patch: http://gcc.gnu.org/viewcvs?view=rev&rev=105682 r105682 | mmitchel | 2005-10-20 18:01:52 +0000 (Thu, 20 Oct 2005)
Subject: Bug 27339 Author: mmitchel Date: Tue May 16 05:39:49 2006 New Revision: 113819 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113819 Log: PR c++/27339 * cp-tree.h (perform_access_checks): New function. * semantics.c (perform_access_checks): New function. (perform_deferred_access_checks): Use it. * parser.c (cp_parser_simple_declaration): Adjust call to cp_parser_init_declarator. (cp_parser_type_parameter): Do not defer checks in default arguments. (cp_parser_explicit_specialization): Adjust call to cp_parser_single_declaration. (cp_parser_init_declarator): Perform template-parameter access checks. (cp_parser_parameter_declaration): Do not defer checks for template parameter default arguments. (cp_parser_template_declaration_after_export): Gather access checks for template parameters, and pass them to cp_parser_single_declaration. (cp_parser_template_parameter_access_checks): New function. (cp_parser_single_declaration): Add checks parameter. PR c++/27339 * g++.dg/parser/access8.C: Adjust error marker. * g++.dg/template/access17.C: New test. * g++.dg/template/access18.C: Likewise. Added: trunk/gcc/testsuite/g++.dg/template/access17.C trunk/gcc/testsuite/g++.dg/template/access18.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/cp-tree.h trunk/gcc/cp/parser.c trunk/gcc/cp/semantics.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/g++.dg/parse/access8.C
Fixed in 4.2.0.
Fixed in 4.1.1.
Subject: Bug 27339 Author: mmitchel Date: Tue May 16 14:54:55 2006 New Revision: 113825 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113825 Log: PR c++/27339 * cp-tree.h (perform_access_checks): New function. * semantics.c (perform_access_checks): New function. (perform_deferred_access_checks): Use it. * parser.c (cp_parser_simple_declaration): Adjust call to cp_parser_init_declarator. (cp_parser_type_parameter): Do not defer checks in default arguments. (cp_parser_explicit_specialization): Adjust call to cp_parser_single_declaration. (cp_parser_init_declarator): Perform template-parameter access checks. (cp_parser_parameter_declaration): Do not defer checks for template parameter default arguments. (cp_parser_template_declaration_after_export): Gather access checks for template parameters, and pass them to cp_parser_single_declaration. (cp_parser_template_parameter_access_checks): New function. (cp_parser_single_declaration): Add checks parameter. PR c++/27339 * g++.dg/parser/access8.C: Adjust error marker. * g++.dg/template/access17.C: New test. * g++.dg/template/access18.C: Likewise. Added: branches/gcc-4_1-branch/gcc/testsuite/g++.dg/template/access17.C branches/gcc-4_1-branch/gcc/testsuite/g++.dg/template/access18.C Modified: branches/gcc-4_1-branch/gcc/cp/ChangeLog branches/gcc-4_1-branch/gcc/cp/cp-tree.h branches/gcc-4_1-branch/gcc/cp/parser.c branches/gcc-4_1-branch/gcc/cp/semantics.c branches/gcc-4_1-branch/gcc/testsuite/ChangeLog branches/gcc-4_1-branch/gcc/testsuite/g++.dg/parse/access8.C