PR c++/79503 - inherited ctor taking base class
authorJason Merrill <jason@redhat.com>
Mon, 20 Feb 2017 06:03:45 +0000 (01:03 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 20 Feb 2017 06:03:45 +0000 (01:03 -0500)
* call.c (add_function_candidate): Also check that
DECL_INHERITED_CTOR_BASE is reference-related to the parameter type.

From-SVN: r245586

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/cpp0x/inh-ctor26.C [new file with mode: 0644]

index 20c7eed3bcb72e027da37b99b13373f74fbbc42e..9b071ebef9e8c6d52be63fc37b64c8132f0ac730 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/79503 - inherited ctor taking base class
+       * call.c (add_function_candidate): Also check that
+       DECL_INHERITED_CTOR_BASE is reference-related to the parameter type.
+
 2017-02-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/79380
index 4ef444b761b31c2b21d4bab29cd94fb8011bcc0a..d6d3a8f61d9470237cef39c1bb1b51c6171453c5 100644 (file)
@@ -2057,7 +2057,9 @@ add_function_candidate (struct z_candidate **candidates,
     {
       tree ptype = non_reference (TREE_VALUE (parmlist));
       tree dtype = DECL_CONTEXT (fn);
-      if (reference_related_p (ptype, dtype))
+      tree btype = DECL_INHERITED_CTOR_BASE (fn);
+      if (reference_related_p (ptype, dtype)
+         && reference_related_p (btype, ptype))
        {
          viable = false;
          reason = inherited_ctor_rejection ();
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor26.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor26.C
new file mode 100644 (file)
index 0000000..e1e6b9e
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/79503
+// { dg-do compile { target c++11 } }
+
+struct payload {};
+
+struct base: private payload {
+    base(payload) {}
+};
+
+struct derived: base {
+    using base::base;
+};
+
+int main()
+{
+    payload data;
+    // error: no matching function for call to 'derived::derived(payload&)'
+    // note: candidate: base::base(payload)
+    // note:   an inherited constructor is not a candidate for initialization from an expression of the same or derived type
+    derived demo(data);
+}