diff options
author | Mark Mitchell <mmitchel@gcc.gnu.org> | 2005-12-20 04:44:20 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2005-12-20 04:44:20 +0000 |
commit | 6b20b203a615aa0a301a006ec96531b1f23337a7 (patch) | |
tree | dbb215ef5d575a86d0e925759b871bf32dec3234 /gcc | |
parent | c2c22cd6345a8e6f58702c5e406fc78cd33ef959 (diff) | |
download | gcc-6b20b203a615aa0a301a006ec96531b1f23337a7.zip gcc-6b20b203a615aa0a301a006ec96531b1f23337a7.tar.gz gcc-6b20b203a615aa0a301a006ec96531b1f23337a7.tar.bz2 |
re PR c++/24915 (Overload errors generated without template instantiations for class member templates)
PR c++/24915
* class.c (add_method): Do not treat templates as identical unless
their return types are the same.
PR c++/24915
* g++.dg/template/overload8.C: New test.
From-SVN: r108837
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 66 | ||||
-rw-r--r-- | gcc/cp/class.c | 28 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/overload8.C | 7 |
4 files changed, 95 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b2b3009..3c79990 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,69 @@ +2005-12-19 Mark Mitchell <mark@codesourcery.com> + + PR c++/24915 + * class.c (add_method): Do not treat templates as identical unless + their return types are the same. + +2005-12-12 Mark Mitchell <mark@codesourcery.com> + + PR c++/25300 + * tree.c (build_qualified_name): Return error_mark_node for + erroneous input. + +2005-12-10 Mark Mitchell <mark@codesourcery.com> + + PR c++/25337 + * pt.c (tsubst_copy_and_build): Permit dependent types for the + object in a class member access expression. + +2005-12-10 Terry Laurenzo <tlaurenzo@gmail.com> + + PR java/9861 + * mangle.c (write_bare_function_type): Mangle return type for + methods of Java classes + +2005-12-08 Théodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr> + + * call.c (build_conditional_expr): Print types in error messages. + +2005-12-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + * expr.c (cxx_expand_expr): Call gcc_unreachable instead of abort. + +2005-12-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + * cp-gimplify.c (gimplify_cp_loop): Use fold_build3. + +2005-12-07 Rafael Ávila de Espíndola <rafael.espindola@gmail.com> + + * Make-lang.in (c++.all.build, c++.install-normal): Remove. + +2005-12-07 Rafael Ávila de Espíndola <rafael.espindola@gmail.com> + + * Make-lang.in: Remove all dependencies on s-gtype. + +2005-12-06 Aldy Hernandez <aldyh@redhat.com> + + PR C++/24138 + * decl.c (reshape_init_array_1): Handle max_index of -1. + +2005-12-06 Roger Sayle <roger@eyesopen.com> + + * typeck.c (build_binary_op): Issue warning if either operand of a + comparison operator is a string literal, except for testing equality + or inequality against NULL. + +2005-12-06 Roger Sayle <roger@eyesopen.com> + + PR c++/25263 + * decl.c (compute_array_index_type): Check that itype is an + INTEGER_CST node before testing/clearing TREE_OVERFLOW. + +2005-12-05 Daniel Berlin <dberlin@dberlin.org> + + * ptree.c (cxx_print_decl): Update to check for decl_common + structure. + 2005-12-02 Mark Mitchell <mark@codesourcery.com> PR c++/24173 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9d53e80..2ccc724 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -982,9 +982,10 @@ add_method (tree type, tree method, tree using_decl) for (fns = current_fns; fns; fns = OVL_NEXT (fns)) { tree fn = OVL_CURRENT (fns); + tree fn_type; + tree method_type; tree parms1; tree parms2; - bool same = 1; if (TREE_CODE (fn) != TREE_CODE (method)) continue; @@ -999,8 +1000,10 @@ add_method (tree type, tree method, tree using_decl) functions in the derived class override and/or hide member functions with the same name and parameter types in a base class (rather than conflicting). */ - parms1 = TYPE_ARG_TYPES (TREE_TYPE (fn)); - parms2 = TYPE_ARG_TYPES (TREE_TYPE (method)); + fn_type = TREE_TYPE (fn); + method_type = TREE_TYPE (method); + parms1 = TYPE_ARG_TYPES (fn_type); + parms2 = TYPE_ARG_TYPES (method_type); /* Compare the quals on the 'this' parm. Don't compare the whole types, as used functions are treated as @@ -1009,23 +1012,26 @@ add_method (tree type, tree method, tree using_decl) && ! DECL_STATIC_FUNCTION_P (method) && (TYPE_QUALS (TREE_TYPE (TREE_VALUE (parms1))) != TYPE_QUALS (TREE_TYPE (TREE_VALUE (parms2))))) - same = 0; + continue; - /* For templates, the template parms must be identical. */ + /* For templates, the return type and template parameters + must be identical. */ if (TREE_CODE (fn) == TEMPLATE_DECL - && !comp_template_parms (DECL_TEMPLATE_PARMS (fn), - DECL_TEMPLATE_PARMS (method))) - same = 0; + && (!same_type_p (TREE_TYPE (fn_type), + TREE_TYPE (method_type)) + || !comp_template_parms (DECL_TEMPLATE_PARMS (fn), + DECL_TEMPLATE_PARMS (method)))) + continue; if (! DECL_STATIC_FUNCTION_P (fn)) parms1 = TREE_CHAIN (parms1); if (! DECL_STATIC_FUNCTION_P (method)) parms2 = TREE_CHAIN (parms2); - if (same && compparms (parms1, parms2) + if (compparms (parms1, parms2) && (!DECL_CONV_FN_P (fn) - || same_type_p (TREE_TYPE (TREE_TYPE (fn)), - TREE_TYPE (TREE_TYPE (method))))) + || same_type_p (TREE_TYPE (fn_type), + TREE_TYPE (method_type)))) { if (using_decl) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 91b7f63..e87eb1d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-19 Mark Mitchell <mark@codesourcery.com> + + PR c++/24915 + * g++.dg/template/overload8.C: New test. + 2005-12-19 Kenneth Zadeck <zadeck@naturalbridge.com> * gcc.c-torture/compile/pr25483 : New test. diff --git a/gcc/testsuite/g++.dg/template/overload8.C b/gcc/testsuite/g++.dg/template/overload8.C new file mode 100644 index 0000000..cc6a05b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload8.C @@ -0,0 +1,7 @@ +// PR c++/24915 + +struct A +{ + template<int> void foo() {} + template<int> int foo() {} +}; |