re PR c++/22618 (Template non-type arguments break class access protection)
authorMark Mitchell <mark@codesourcery.com>
Thu, 20 Oct 2005 18:01:52 +0000 (18:01 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 20 Oct 2005 18:01:52 +0000 (18:01 +0000)
PR c++/22618
* search.c (accessible_p): Check access in the outermost set of
template parameters.
PR c++/22618
* g++.dg/parse/access8.C: New test.

From-SVN: r105682

gcc/cp/ChangeLog
gcc/cp/search.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/access8.C [new file with mode: 0644]

index 2344732..bba2e8e 100644 (file)
@@ -1,3 +1,9 @@
+2005-10-20  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/22618
+       * search.c (accessible_p): Check access in the outermost set of
+       template parameters.
+
 2005-10-20  Richard Guenther  <rguenther@suse.de>
 
        * decl.c (grokdeclarator): Fix ambiguous pedwarn message.
index 795e8c2..090510b 100644 (file)
@@ -872,8 +872,12 @@ accessible_p (tree type, tree decl, bool consider_local_p)
   /* In a template declaration, we cannot be sure whether the
      particular specialization that is instantiated will be a friend
      or not.  Therefore, all access checks are deferred until
-     instantiation.  */
-  if (processing_template_decl)
+     instantiation.  However, PROCESSING_TEMPLATE_DECL is set in the
+     parameter list for a template (because we may see dependent types
+     in default arguments for template parameters), and access
+     checking should be performed in the outermost parameter list.  */ 
+  if (processing_template_decl 
+      && (!processing_template_parmlist || processing_template_decl > 1))
     return 1;
 
   if (!TYPE_P (type))
index b94bce8..4a63875 100644 (file)
@@ -1,3 +1,8 @@
+2005-10-20  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/22618
+       * g++.dg/parse/access8.C: New test.
+
 2005-10-20  Richard Guenther  <rguenther@suse.de>
 
        PR c++/24439
diff --git a/gcc/testsuite/g++.dg/parse/access8.C b/gcc/testsuite/g++.dg/parse/access8.C
new file mode 100644 (file)
index 0000000..badea1c
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/22618
+
+class foo
+{
+  typedef int memfun;  // { dg-error "private" }
+};
+
+template<foo::memfun> // { dg-error "context" } 
+struct fm_obj { };
+
+template <typename T = foo::memfun> // { dg-error "context" }
+struct S {};