PR c++/84441 - ICE with base initialized from ?:

* call.c (unsafe_copy_elision_p): Handle COND_EXPR.

From-SVN: r258022
This commit is contained in:
Jason Merrill 2018-02-26 21:45:12 -05:00 committed by Jason Merrill
parent ab5f26bba1
commit a2444ce970
3 changed files with 33 additions and 0 deletions

View File

@ -1,5 +1,8 @@
2018-02-26 Jason Merrill <jason@redhat.com>
PR c++/84441 - ICE with base initialized from ?:
* call.c (unsafe_copy_elision_p): Handle COND_EXPR.
PR c++/84520 - ICE with generic lambda in NSDMI.
* lambda.c (lambda_expr_this_capture): Don't look for fake NSDMI
'this' in a generic lambda instantiation.

View File

@ -7580,6 +7580,15 @@ unsafe_copy_elision_p (tree target, tree exp)
/* build_compound_expr pushes COMPOUND_EXPR inside TARGET_EXPR. */
while (TREE_CODE (init) == COMPOUND_EXPR)
init = TREE_OPERAND (init, 1);
if (TREE_CODE (init) == COND_EXPR)
{
/* We'll end up copying from each of the arms of the COND_EXPR directly
into the target, so look at them. */
if (tree op = TREE_OPERAND (init, 1))
if (unsafe_copy_elision_p (target, op))
return true;
return unsafe_copy_elision_p (target, TREE_OPERAND (init, 2));
}
return (TREE_CODE (init) == AGGR_INIT_EXPR
&& !AGGR_INIT_VIA_CTOR_P (init));
}

View File

@ -0,0 +1,21 @@
// PR c++/84441
// { dg-do compile { target c++11 } }
struct B {
int *b;
};
struct A {
B b;
A (A &&);
};
struct C {
A c;
int d;
};
C bar ();
struct D : C {
D ()
: C (0 ? bar () : bar ())
{}
};
D d;