From: Jason Merrill Date: Tue, 11 Mar 2003 10:33:28 +0000 (-0500) Subject: re PR c++/8660 (template overloading ICE in tsubst_expr, at cp/pt.c:7644) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5b8e011cf6958419bf1c72940c3fd5fd9e6a791b;p=gcc.git re PR c++/8660 (template overloading ICE in tsubst_expr, at cp/pt.c:7644) PR c++/8660 * decl2.c (check_classfn): A member template only matches a member template. From-SVN: r64166 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c3299d7d51b..f0421f1c44e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-03-11 Jason Merrill + + PR c++/8660 + * decl2.c (check_classfn): A member template only matches a + member template. + 2003-03-11 Neil Booth * Make-lang.in (CXX_C_OBJS): Update. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 1920c6558e4..6a4250efb38 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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)))