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:
parent
ab5f26bba1
commit
a2444ce970
@ -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.
|
||||
|
@ -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));
|
||||
}
|
||||
|
21
gcc/testsuite/g++.dg/cpp0x/elision3.C
Normal file
21
gcc/testsuite/g++.dg/cpp0x/elision3.C
Normal 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;
|
Loading…
Reference in New Issue
Block a user