call.c (reference_related_p): Check for error_mark_node.
authorJason Merrill <jason@redhat.com>
Thu, 19 Aug 2010 17:24:19 +0000 (13:24 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 19 Aug 2010 17:24:19 +0000 (13:24 -0400)
* call.c (reference_related_p): Check for error_mark_node.
(add_function_candidate): Check it instead of
same_type_ignoring_top_level_qualifiers_p.

From-SVN: r163382

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/synth3.C [new file with mode: 0644]

index bac1182..82c8299 100644 (file)
@@ -1,5 +1,9 @@
 2010-08-19  Jason Merrill  <jason@redhat.com>
 
+       * call.c (reference_related_p): Check for error_mark_node.
+       (add_function_candidate): Check it instead of
+       same_type_ignoring_top_level_qualifiers_p.
+
        PR c++/45315
        * init.c (build_new_1): Don't use build_value_init in a template.
        (build_value_init): Make sure we don't.
index 71297ec..adcf984 100644 (file)
@@ -999,6 +999,9 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
 bool
 reference_related_p (tree t1, tree t2)
 {
+  if (t1 == error_mark_node || t2 == error_mark_node)
+    return false;
+
   t1 = TYPE_MAIN_VARIANT (t1);
   t2 = TYPE_MAIN_VARIANT (t2);
 
@@ -1598,8 +1601,10 @@ add_function_candidate (struct z_candidate **candidates,
 
   /* Kludge: When looking for a function from a subobject while generating
      an implicit copy/move constructor/operator=, don't consider anything
-     that takes (a reference to) a different type.  See c++/44909.  */
-  else if (flags & LOOKUP_SPECULATIVE)
+     that takes (a reference to) an unrelated type.  See c++/44909.  */
+  else if ((flags & LOOKUP_SPECULATIVE)
+          || (current_function_decl
+              && DECL_DEFAULTED_FN (current_function_decl)))
     {
       if (DECL_CONSTRUCTOR_P (fn))
        i = 1;
@@ -1611,8 +1616,8 @@ add_function_candidate (struct z_candidate **candidates,
       if (i && len == i)
        {
          parmnode = chain_index (i-1, parmlist);
-         if (!(same_type_ignoring_top_level_qualifiers_p
-               (non_reference (TREE_VALUE (parmnode)), ctype)))
+         if (!reference_related_p (non_reference (TREE_VALUE (parmnode)),
+                                   ctype))
            viable = 0;
        }
     }
index 805cd7a..e8bbfc1 100644 (file)
@@ -1,5 +1,7 @@
 2010-08-19  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/init/synth3.C: New.
+
        * g++.dg/init/value8.C: New.
 
        * g++.dg/tree-ssa/empty-2.C: New.
diff --git a/gcc/testsuite/g++.dg/init/synth3.C b/gcc/testsuite/g++.dg/init/synth3.C
new file mode 100644 (file)
index 0000000..d656ddb
--- /dev/null
@@ -0,0 +1,21 @@
+// Test that synthesizing the C copy constructor doesn't require B<int> to
+// be complete.
+
+template <class T>
+struct B
+{
+  typename T::NT nt;
+};
+
+struct A
+{
+  A ();
+  A (const A&);
+  A (const B<int>&);
+};
+
+struct C: A { };
+
+C c;
+C c2(c);
+