re PR c++/8660 (template overloading ICE in tsubst_expr, at cp/pt.c:7644)
authorJason Merrill <jason@redhat.com>
Tue, 11 Mar 2003 10:33:28 +0000 (05:33 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 11 Mar 2003 10:33:28 +0000 (05:33 -0500)
        PR c++/8660
        * decl2.c (check_classfn): A member template only matches a
        member template.

From-SVN: r64166

gcc/cp/ChangeLog
gcc/cp/decl2.c

index c3299d7d51b2ecce6ee1bb519948ba4f21fc86c8..f0421f1c44ead3eaac2725cc0e2aaa5efa51f8fa 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-11  Jason Merrill  <jason@redhat.com>
+
+       PR c++/8660
+       * decl2.c (check_classfn): A member template only matches a 
+       member template.
+
 2003-03-11  Neil Booth  <neil@daikokuya.co.uk>
 
        * Make-lang.in (CXX_C_OBJS): Update.
index 1920c6558e4ce2b4d56fe97b6911dea58cab5203..6a4250efb38f7cf5105bc769bd5137567fb966ac 100644 (file)
@@ -655,6 +655,7 @@ tree
 check_classfn (tree ctype, tree function)
 {
   int ix;
+  int is_template;
   
   if (DECL_USE_TEMPLATE (function)
       && !(TREE_CODE (function) == TEMPLATE_DECL
@@ -672,6 +673,10 @@ check_classfn (tree ctype, tree function)
        find the method, but we don't complain.  */
     return NULL_TREE;
 
+  /* OK, is this a definition of a member template?  */
+  is_template = (TREE_CODE (function) == TEMPLATE_DECL
+                || (processing_template_decl - template_class_depth (ctype)));
+
   ix = lookup_fnfields_1 (complete_type (ctype),
                          DECL_CONSTRUCTOR_P (function) ? ctor_identifier :
                          DECL_DESTRUCTOR_P (function) ? dtor_identifier :
@@ -704,6 +709,11 @@ check_classfn (tree ctype, tree function)
          if (DECL_STATIC_FUNCTION_P (fndecl)
              && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
            p1 = TREE_CHAIN (p1);
+
+         /* A member template definition only matches a member template
+            declaration.  */
+         if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL))
+           continue;
              
          if (same_type_p (TREE_TYPE (TREE_TYPE (function)),
                           TREE_TYPE (TREE_TYPE (fndecl)))