]> gcc.gnu.org Git - gcc.git/commitdiff
re PR c++/2094 (unimplemented: use of `ptrmem_cst' in template type unification)
authorGiovanni Bajo <giovannibajo@libero.it>
Fri, 14 Nov 2003 04:51:21 +0000 (05:51 +0100)
committerBernardo Innocenti <bernie@gcc.gnu.org>
Fri, 14 Nov 2003 04:51:21 +0000 (05:51 +0100)
        PR c++/2094
        * pt.c (unify): Add support for PTRMEM_CST and
        FIELD_DECL unification.

From-SVN: r73577

gcc/cp/ChangeLog
gcc/cp/pt.c

index 7f8402d1e96c0e34573896b50b79f056ee16a692..7e036b3a19167588a1afa1979ae09bdc155a3ef3 100644 (file)
@@ -1,3 +1,9 @@
+2003-11-14  Giovanni Bajo  <giovannibajo@libero.it>
+
+        PR c++/2094
+        * pt.c (unify): Add support for PTRMEM_CST and
+        FIELD_DECL unification.
+
 2003-11-13  Richard Earnshaw  <rearnsha@arm.com>
 
        * decl.c (grokfndecl): Change OK to type tree.
index cd93423ed6dd3af1031ebcdbcbd76e7c3ef29138..4afe974616dbe2f02ff8bf81105cbd2116557d9b 100644 (file)
@@ -9617,6 +9617,27 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
       TREE_VEC_ELT (targs, idx) = arg;
       return 0;
 
+    case PTRMEM_CST:
+     {
+        /* A pointer-to-member constant can be unified only with
+         another constant.  */
+      if (TREE_CODE (arg) != PTRMEM_CST)
+        return 1;
+
+      /* Just unify the class member. It would be useless (and possibly
+         wrong, depending on the strict flags) to unify also
+         PTRMEM_CST_CLASS, because we want to be sure that both parm and
+         arg refer to the same variable, even if through different
+         classes. For instance:
+
+         struct A { int x; };
+         struct B : A { };
+
+         Unification of &A::x and &B::x must succeed.  */
+      return unify (tparms, targs, PTRMEM_CST_MEMBER (parm),
+                    PTRMEM_CST_MEMBER (arg), strict);
+     }
+
     case POINTER_TYPE:
       {
        if (TREE_CODE (arg) != POINTER_TYPE)
@@ -9805,6 +9826,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
        return 1;
       return 0;
 
+    case FIELD_DECL:
     case TEMPLATE_DECL:
       /* Matched cases are handled by the ARG == PARM test above.  */
       return 1;
This page took 0.114432 seconds and 5 git commands to generate.