OSDN Git Service

PR c++/15701
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 May 2004 22:48:30 +0000 (22:48 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 May 2004 22:48:30 +0000 (22:48 +0000)
* friend.c (add_friend): Do not try to perform access checks for
functions from dependent classes.

PR c++/15701
* g++.dg/template/friend29.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82516 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/friend.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/friend29.C [new file with mode: 0644]

index 4ead672..4549203 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-31  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15701
+       * friend.c (add_friend): Do not try to perform access checks for
+       functions from dependent classes.
+
 2004-05-31  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * cxx-pretty-print.c (pp_cxx_colon_colon): Expor.
index e55adaa..f815b99 100644 (file)
@@ -164,7 +164,11 @@ add_friend (tree type, tree decl, bool complain)
     }
 
   if (DECL_CLASS_SCOPE_P (decl))
-    perform_or_defer_access_check (TYPE_BINFO (DECL_CONTEXT (decl)), decl);
+    {
+      tree class_binfo = TYPE_BINFO (DECL_CONTEXT (decl));
+      if (!uses_template_parms (BINFO_TYPE (class_binfo)))
+       perform_or_defer_access_check (class_binfo, decl);
+    }
 
   maybe_add_class_template_decl_list (type, decl, /*friend_p=*/1);
 
index a337797..67b637b 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-31  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/15701
+       * g++.dg/template/friend29.C: New test.
+
 2004-05-31  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        PR c/15749
diff --git a/gcc/testsuite/g++.dg/template/friend29.C b/gcc/testsuite/g++.dg/template/friend29.C
new file mode 100644 (file)
index 0000000..1c0c6f0
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/15701
+
+template<template<int> class T> struct A : T<0>
+{
+    void foo();
+    template<template<int> class U> friend void A<U>::foo();
+};
+
+template<int> struct B {};
+
+A<B> a;