diff mbox

fix 78488, ICE with inherited ctor

Message ID 2703a92c-1b9c-2a4d-5bf4-e1f136e22d5f@acm.org
State New
Headers show

Commit Message

Nathan Sidwell Jan. 18, 2017, 7:29 p.m. UTC
This patch fixes an ICE with inherited default ctor and a local decl. 
In such a case we don't have any conv args (just the object expression, 
handled differently).  Thus 'num_convs-1' is -1 and we seg fault at:
  cand->convs[cand->num_convs-1]->ellipsis_p
do just check it's non-zero first.

committed to trunk

nathan
diff mbox

Patch

2017-01-18  Nathan Sidwell  <nathan@acm.org>

	PR c++/78488
	* call.c (build_over_call): When checking ellipsis conversions for
	an inherited ctor, make sure there is at least one conversion.

	* g++.dg/cpp1z/inh-ctor37.C: New.

Index: cp/call.c
===================================================================
--- cp/call.c	(revision 244586)
+++ cp/call.c	(working copy)
@@ -7899,6 +7899,7 @@  build_over_call (struct z_candidate *can
 	 could handle this by open-coding the inherited constructor rather than
 	 defining it, but let's not bother now.  */
       if (!cp_unevaluated_operand
+	  && cand->num_convs
 	  && cand->convs[cand->num_convs-1]->ellipsis_p)
 	{
 	  if (complain & tf_error)
Index: testsuite/g++.dg/cpp1z/inh-ctor37.C
===================================================================
--- testsuite/g++.dg/cpp1z/inh-ctor37.C	(revision 0)
+++ testsuite/g++.dg/cpp1z/inh-ctor37.C	(working copy)
@@ -0,0 +1,13 @@ 
+// { dg-do compile { target c++11 } }
+// PR 78488, seg fault with inherited ctor
+
+struct Foo { Foo() {} };
+
+struct Bar : Foo {
+  using Foo::Foo;
+  Bar(void*);
+};
+
+int main() {
+ Bar f;
+}