From a2444ce97021c7a1e9afe05d014435c4c6933659 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 26 Feb 2018 21:45:12 -0500 Subject: [PATCH] PR c++/84441 - ICE with base initialized from ?: * call.c (unsafe_copy_elision_p): Handle COND_EXPR. From-SVN: r258022 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/call.c | 9 +++++++++ gcc/testsuite/g++.dg/cpp0x/elision3.C | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/elision3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fe5c7864f3a..e34611324c4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2018-02-26 Jason Merrill + 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. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c47befdbf7f..11fe28292fb 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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)); } diff --git a/gcc/testsuite/g++.dg/cpp0x/elision3.C b/gcc/testsuite/g++.dg/cpp0x/elision3.C new file mode 100644 index 00000000000..7c5c8b9f0b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/elision3.C @@ -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; -- 2.30.2