diff options
Diffstat (limited to 'gcc/cp/decl2.c')
| -rw-r--r-- | gcc/cp/decl2.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index e094493f988..5730d369efc 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -612,15 +612,19 @@ check_java_method (tree method) /* Sanity check: report error if this function FUNCTION is not really a member of the class (CTYPE) it is supposed to belong to. - CNAME is the same here as it is for grokclassfn above. - TEMPLATE_HEADER_P is true when this declaration comes with a - template header. */ + TEMPLATE_PARMS is used to specifiy the template parameters of a member + template passed as FUNCTION_DECL. If the member template is passed as a + TEMPLATE_DECL, it can be NULL since the parameters can be extracted + from the declaration. If the function is not a function template, it + must be NULL. + It returns the original declaration for the function, or NULL_TREE + if no declaration was found (and an error was emitted). */ tree -check_classfn (tree ctype, tree function, bool template_header_p) +check_classfn (tree ctype, tree function, tree template_parms) { int ix; - int is_template; + bool is_template; if (DECL_USE_TEMPLATE (function) && !(TREE_CODE (function) == TEMPLATE_DECL @@ -638,9 +642,20 @@ check_classfn (tree ctype, tree function, bool template_header_p) find the method, but we don't complain. */ return NULL_TREE; + /* Basic sanity check: for a template function, the template parameters + either were not passed, or they are the same of DECL_TEMPLATE_PARMS. */ + if (TREE_CODE (function) == TEMPLATE_DECL) + { + my_friendly_assert (!template_parms + || comp_template_parms + (template_parms, + DECL_TEMPLATE_PARMS (function)), + 20040303); + template_parms = DECL_TEMPLATE_PARMS (function); + } + /* OK, is this a definition of a member template? */ - is_template = (TREE_CODE (function) == TEMPLATE_DECL - || template_header_p); + is_template = (template_parms != NULL_TREE); ix = lookup_fnfields_1 (complete_type (ctype), DECL_CONSTRUCTOR_P (function) ? ctor_identifier : @@ -684,6 +699,9 @@ check_classfn (tree ctype, tree function, bool template_header_p) if (same_type_p (TREE_TYPE (TREE_TYPE (function)), TREE_TYPE (TREE_TYPE (fndecl))) && compparms (p1, p2) + && (!is_template + || comp_template_parms (template_parms, + DECL_TEMPLATE_PARMS (fndecl))) && (DECL_TEMPLATE_SPECIALIZATION (function) == DECL_TEMPLATE_SPECIALIZATION (fndecl)) && (!DECL_TEMPLATE_SPECIALIZATION (function) |

