OSDN Git Service

PR c++/17936
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Oct 2004 22:50:00 +0000 (22:50 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 Oct 2004 22:50:00 +0000 (22:50 +0000)
* 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.

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

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 5196df9..44c6b70 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 85d0aa6..6f777b1 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 c794e35..36ff89b 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 624e57e..ac5fa07 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();