OSDN Git Service

cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Jan 2003 11:35:33 +0000 (11:35 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Jan 2003 11:35:33 +0000 (11:35 +0000)
PR c++/9437
* pt.c (unify): Don't unify '*T' with 'U C::*'.
testsuite:
PR c++/9437
* g++.dg/template/unify4.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@62070 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 09445a0..d84824d 100644 (file)
@@ -1,5 +1,8 @@
 2003-01-28  Nathan Sidwell  <nathan@codesourcery.com>
 
+       PR c++/9437
+       * pt.c (unify): Don't unify '*T' with 'U C::*'.
+
        PR c++/3902
        * parser.c (cp_parser_decl_specifier_seq): Cannot have constructor
        inside a declarator.
index 21d3536..b3b8106 100644 (file)
@@ -9447,6 +9447,12 @@ unify (tparms, targs, parm, arg, strict)
        }
       else
        {
+         /* If ARG is an offset type, we're trying to unify '*T' with
+            'U C::*', which is ill-formed. See the comment in the
+            POINTER_TYPE case about this ugliness. */
+         if (TREE_CODE (arg) == OFFSET_TYPE)
+           return 1;
+         
          /* If PARM is `const T' and ARG is only `int', we don't have
             a match unless we are allowing additional qualification.
             If ARG is `const int' and PARM is just `T' that's OK;
index 9e5ea48..6c16728 100644 (file)
@@ -1,3 +1,8 @@
+2003-01-29  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/9437
+       * g++.dg/template/unify4.C: New test.
+
 2003-01-28  Richard Sandiford  <rsandifo@redhat.com>
 
        * gcc.c-torture/execute/20030128-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/unify4.C b/gcc/testsuite/g++.dg/template/unify4.C
new file mode 100644 (file)
index 0000000..19d9f3a
--- /dev/null
@@ -0,0 +1,18 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com>
+
+// PR 9437. We'd unify 'T *' with 'U C::*', which is obviously broken
+
+struct X
+{
+  template <typename T>
+  operator T* () const { return static_cast<T*> (0); }
+} null;
+
+struct A { int i; };
+
+static void f (int A::* pmi) { }
+
+int main () { f (null); } // { dg-error "cannot convert" "" }