]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport:
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Wed, 1 Feb 2006 11:52:56 +0000 (11:52 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Wed, 1 Feb 2006 11:52:56 +0000 (11:52 +0000)
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.

* g++.dg/template/overload8.C: New test.

From-SVN: r110472

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/overload8.C [new file with mode: 0644]

index b3b7bf76b5648735b967b2897c181f7748fa20a1..5ea2f7ddfda8e93bf4717bd3c3af2db416517781 100644 (file)
@@ -1,4 +1,13 @@
-2006-01-31  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+2006-02-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       Backport:
+       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.
+
+2006-02-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        Backport:
        2005-12-19  Mark Mitchell  <mark@codesourcery.com>
index 5a0d076a515ca931264d81b0cd6a79af638f128a..c14313c8bf8b196051cb2f2c44426e6c32a83244 100644 (file)
@@ -879,9 +879,10 @@ add_method (tree type, tree method, int error_p)
           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;
@@ -896,8 +897,10 @@ add_method (tree type, tree method, int error_p)
             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
@@ -906,23 +909,25 @@ add_method (tree type, tree method, int error_p)
              && ! 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.  */
          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_CONTEXT (fn) == type)
                /* Defer to the local function.  */
index c8b173e854951128df4a7a437377b34cfb6c71de..4cad37618e17699800acf63afa0348aaeb56d5f8 100644 (file)
@@ -1,4 +1,12 @@
-2006-01-31  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+2006-02-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       Backport:
+       2005-12-19  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/24915
+       * g++.dg/template/overload8.C: New test.
+
+2006-02-01  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        Backport:
        2005-12-19  Mark Mitchell  <mark@codesourcery.com>
diff --git a/gcc/testsuite/g++.dg/template/overload8.C b/gcc/testsuite/g++.dg/template/overload8.C
new file mode 100644 (file)
index 0000000..cc6a05b
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/24915
+
+struct A
+{
+  template<int> void foo() {}
+  template<int> int foo() {}
+};