re PR c++/8099 (Friend classes and template specializations)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Thu, 19 Dec 2002 15:11:29 +0000 (15:11 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Thu, 19 Dec 2002 15:11:29 +0000 (15:11 +0000)
PR c++/8099
* friend.c (make_friend_class): Allow partial specialization
when declaration is not a template friend.

* g++.dg/template/friend9.C: New test.

From-SVN: r60308

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

index 042e0c0ed9d2a4486cb9f73f27ed3eed5e412db3..1d7d395e34454ad0e6b47f59b9944ab474ba5065 100644 (file)
@@ -1,3 +1,9 @@
+2002-12-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/8099
+       * friend.c (make_friend_class): Allow partial specialization
+       when declaration is not a template friend.
+
 2002-12-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/3663
index 9e4741143126f4cbae66dd60191d8d494d8d3de0..050862d0151e4648992dfc73b74f455132527fe2 100644 (file)
@@ -205,24 +205,25 @@ make_friend_class (type, friend_type)
       return;
     }
 
-  if (CLASS_TYPE_P (friend_type)
-      && CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
-      && uses_template_parms (friend_type))
-    {
-      /* [temp.friend]
-        
-        Friend declarations shall not declare partial
-        specializations.  */
-      error ("partial specialization `%T' declared `friend'",
-               friend_type);
-      return;
-    }
-  
   if (processing_template_decl > template_class_depth (type))
     /* If the TYPE is a template then it makes sense for it to be
        friends with itself; this means that each instantiation is
        friends with all other instantiations.  */
-    is_template_friend = 1;
+    {
+      if (CLASS_TYPE_P (friend_type)
+         && CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
+         && uses_template_parms (friend_type))
+       {
+         /* [temp.friend]
+            Friend declarations shall not declare partial
+            specializations.  */
+         error ("partial specialization `%T' declared `friend'",
+                friend_type);
+         return;
+       }
+  
+      is_template_friend = 1;
+    }
   else if (same_type_p (type, friend_type))
     {
       pedwarn ("class `%T' is implicitly friends with itself",
index a1510c04a337daa6656a9347320ce246a4c35c0f..d5f296f2d4a3c281de0a5684bd6778e38f9906ef 100644 (file)
@@ -1,3 +1,8 @@
+2002-12-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/8099
+       * g++.dg/template/friend9.C: New test.
+
 2002-11-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/3663
diff --git a/gcc/testsuite/g++.dg/template/friend9.C b/gcc/testsuite/g++.dg/template/friend9.C
new file mode 100644 (file)
index 0000000..4464e5f
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do compile }
+// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// PR c++/8099
+// Partial specialization as friend class
+
+template <int N, typename T> struct X;
+template <typename T>        struct X<1,T>;
+
+template <typename P> class Y {
+    static int i;
+    template <int N, typename T> friend struct X;
+    friend struct X<1,P>;
+};
+
+template <typename T> struct X<1,T> {
+    X () { Y<T>::i; };     // access private field
+};