]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c++/17936 (Declaration of specialization rejected)
authorMark Mitchell <mark@codesourcery.com>
Mon, 11 Oct 2004 22:50:00 +0000 (22:50 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 11 Oct 2004 22:50:00 +0000 (22:50 +0000)
PR c++/17936
* cp-tree.h (CLASSTYPE_TEMPLATE_SPECIALIZATION): Add a comment.
* pt.c (optimize_specialization_lookup_p): Do not optimize lookups
for members of partial or explicit specializations.

PR c++/17936
* g++.dg/template/spec18.C: New test.

From-SVN: r88905

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

index 5196df9db4fd02c5c6482a3ef1dd2dd4d0735c32..44c6b70abe6075756e132b22eb354f2dba127417 100644 (file)
@@ -1,5 +1,10 @@
 2004-10-11  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/17936
+       * cp-tree.h (CLASSTYPE_TEMPLATE_SPECIALIZATION): Add a comment.
+       * pt.c (optimize_specialization_lookup_p): Do not optimize lookups
+       for members of partial or explicit specializations.
+
        PR c++/17929
        * decl2.c (finish_anon_union): Robustify.
 
index 85d0aa6a79131f228e3177a1d28ece0219d84b2d..6f777b195efd2b98ae4894932190c0c1d74c4808 100644 (file)
@@ -2713,6 +2713,9 @@ struct lang_decl GTY(())
 
 #define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2)
 #define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2)
+
+/* Returns true for an explicit or partial specialization of a class
+   template.  */
 #define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
   (CLASSTYPE_USE_TEMPLATE (NODE) == 2)
 #define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
index c794e35bf4efbdc64c35906f9c70e3dbc64742fd..36ff89b2679414c21a015d0a77f9d606463ef39c 100644 (file)
@@ -774,6 +774,12 @@ optimize_specialization_lookup_p (tree tmpl)
          /* DECL_CLASS_SCOPE_P holds of T::f even if T is a template
             parameter.  */
          && CLASS_TYPE_P (DECL_CONTEXT (tmpl))
+         /* The optimized lookup depends on the fact that the
+            template arguments for the member function template apply
+            purely to the containing class, which is not true if the
+            containing class is an explicit or partial
+            specialization.  */
+         && !CLASSTYPE_TEMPLATE_SPECIALIZATION (DECL_CONTEXT (tmpl))
          && !DECL_MEMBER_TEMPLATE_P (tmpl)
          && !DECL_CONV_FN_P (tmpl)
          /* It is possible to have a template that is not a member
index 624e57ef3012cb56d09b060415a2c096dbdf60ec..ac5fa076e425cf0756600c951d18ba0713f686e7 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-11  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/17936
+       * g++.dg/template/spec18.C: New test.
+
 2004-10-11  Steve Ellcey  <sje@cup.hp.com>
 
        * testsuite/gcc.dg/ia64-asm-1.c: Add prototype for abort
diff --git a/gcc/testsuite/g++.dg/template/spec18.C b/gcc/testsuite/g++.dg/template/spec18.C
new file mode 100644 (file)
index 0000000..a22e854
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/17936
+
+template<int, int N> struct A
+{
+  void foo();
+};
+
+template<int N> struct A<1, N>
+{
+  void foo();
+};
+
+template<> void A<1, 2>::foo();
This page took 0.108308 seconds and 5 git commands to generate.