OSDN Git Service

PR c++/18733
authorgiovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 23 Dec 2004 01:49:39 +0000 (01:49 +0000)
committergiovannibajo <giovannibajo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 23 Dec 2004 01:49:39 +0000 (01:49 +0000)
* pt.c (check_explicit_specialization): Use special logic to validate
befriended specializations.

PR c++/18733
* g++.dg/template/friend33.C: New testcase.

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

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

index ee0f56e..2d6e1af 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-23  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
+
+       PR c++/18733
+       * pt.c (check_explicit_specialization): Use special logic to validate
+       befriended specializations.
+
 2004-12-22  Mark Mitchell  <mark@codesourcery.com>
 
        * rtti.c (emit_support_tinfos): Avoid using C99 semantics.
index a73f691..07cdd5d 100644 (file)
@@ -1738,7 +1738,15 @@ check_explicit_specialization (tree declarator,
   tree dname = DECL_NAME (decl);
   tmpl_spec_kind tsk;
 
-  tsk = current_tmpl_spec_kind (template_count);
+  if (is_friend)
+    {
+      if (!processing_specialization)
+       tsk = tsk_none;
+      else
+       tsk = tsk_excessive_parms;
+    }
+  else
+    tsk = current_tmpl_spec_kind (template_count);
 
   switch (tsk)
     {
index 555353a..b966939 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-23  Giovanni Bajo  <giovannibajo@gcc.gnu.org>
+
+       PR c++/18733
+       * g++.dg/template/friend33.C: New testcase.
+
 2004-12-22  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/18464
diff --git a/gcc/testsuite/g++.dg/template/friend33.C b/gcc/testsuite/g++.dg/template/friend33.C
new file mode 100644 (file)
index 0000000..f1b5cb2
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// PR c++/18733: Validation of template headers in friends
+
+template<int> struct A
+{
+  void foo();
+};
+
+struct B
+{
+  friend void A<0>::foo();
+};