re PR c++/57942 (g++-4.8.1 tries to instantiate wrong constructor)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 24 Jul 2013 08:35:54 +0000 (08:35 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 24 Jul 2013 08:35:54 +0000 (08:35 +0000)
/cp
2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/57942
* typeck.c (ptr_reasonably_similar): Use COMPARE_STRICT if one of
the target types is incomplete; return a bool, not an int.
* cp-tree.h (ptr_reasonably_similar): Adjust declaration.

/testsuite
2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/57942
* g++.dg/inherit/pr57942.C: New.

From-SVN: r201201

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/pr57942.C [new file with mode: 0644]

index 862e8597086c3aa063d31d00753fd2858eb61e74..f7052cb54aa0ea8cc047cdfac4998d8b93f4cf47 100644 (file)
@@ -1,3 +1,10 @@
+2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/57942
+       * typeck.c (ptr_reasonably_similar): Use COMPARE_STRICT if one of
+       the target types is incomplete; return a bool, not an int.
+       * cp-tree.h (ptr_reasonably_similar): Adjust declaration.
+
 2013-07-22  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * cp-tree.h (DERIVED_FROM_P): Pass tf_none to lookup_base, not
index 459c0e27ef30043f98467c28fc2dd2a79bfce944..4a2271fcce08f75a2d6316f5a145cc779abaf698 100644 (file)
@@ -6022,7 +6022,7 @@ extern tree convert_for_initialization            (tree, tree, tree, int,
 extern int comp_ptr_ttypes                     (tree, tree);
 extern bool comp_ptr_ttypes_const              (tree, tree);
 extern bool error_type_p                       (const_tree);
-extern int ptr_reasonably_similar              (const_tree, const_tree);
+extern bool ptr_reasonably_similar             (const_tree, const_tree);
 extern tree build_ptrmemfunc                   (tree, tree, int, bool,
                                                 tsubst_flags_t);
 extern int cp_type_quals                       (const_tree);
index ef781a3c644d9d097e2af8c964fa48b8f0736a69..6f330559adf06793833b86e7ff899cd0aed9848f 100644 (file)
@@ -8599,10 +8599,10 @@ error_type_p (const_tree type)
     }
 }
 
-/* Returns 1 if to and from are (possibly multi-level) pointers to the same
+/* Returns true if to and from are (possibly multi-level) pointers to the same
    type or inheritance-related types, regardless of cv-quals.  */
 
-int
+bool
 ptr_reasonably_similar (const_tree to, const_tree from)
 {
   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
@@ -8614,7 +8614,7 @@ ptr_reasonably_similar (const_tree to, const_tree from)
        return !error_type_p (to);
 
       if (TREE_CODE (to) != TREE_CODE (from))
-       return 0;
+       return false;
 
       if (TREE_CODE (from) == OFFSET_TYPE
          && comptypes (TYPE_OFFSET_BASETYPE (to),
@@ -8624,19 +8624,24 @@ ptr_reasonably_similar (const_tree to, const_tree from)
 
       if (TREE_CODE (to) == VECTOR_TYPE
          && vector_types_convertible_p (to, from, false))
-       return 1;
+       return true;
 
       if (TREE_CODE (to) == INTEGER_TYPE
          && TYPE_PRECISION (to) == TYPE_PRECISION (from))
-       return 1;
+       return true;
 
       if (TREE_CODE (to) == FUNCTION_TYPE)
        return !error_type_p (to) && !error_type_p (from);
 
       if (!TYPE_PTR_P (to))
-       return comptypes
-         (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
-          COMPARE_BASE | COMPARE_DERIVED);
+       {
+         /* When either type is incomplete avoid DERIVED_FROM_P,
+            which may call complete_type (c++/57942).  */
+         bool b = !COMPLETE_TYPE_P (to) || !COMPLETE_TYPE_P (from);
+         return comptypes
+           (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
+            b ? COMPARE_STRICT : COMPARE_BASE | COMPARE_DERIVED);
+       }
     }
 }
 
index 7b24942e113538ee3e3d04da131583b6ee1907f2..1cfb5a4f945f172c61955a32dd8f663fc846f310 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-24  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/57942
+       * g++.dg/inherit/pr57942.C: New.
+
 2013-07-23  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/bool2.h: New file, test the code generation
diff --git a/gcc/testsuite/g++.dg/inherit/pr57942.C b/gcc/testsuite/g++.dg/inherit/pr57942.C
new file mode 100644 (file)
index 0000000..580e9ec
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/57942
+
+template<typename T> struct S { typename T::error type; };
+struct X {};
+void f(S<int>*);
+void f(...);
+void g() { f((X*)0); }
+struct Y;
+void h() { f((Y*)0); }