PR c++/86485 - -Wmaybe-unused with empty class ?:
The problem in this testcase is that the front end expects an rvalue COND_EXPR to initialize a single temporary from one of the arms. But because gimplify_cond_expr used MODIFY_EXPR, instead the arms would each create their own temporary and then copy that into the common temporary. So, let's use INIT_EXPR instead. * gimplify.c (gimplify_cond_expr): Use INIT_EXPR. From-SVN: r269403
This commit is contained in:
parent
dbcd32f889
commit
507318f109
@ -1,3 +1,8 @@
|
||||
2019-03-02 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/86485 - -Wmaybe-unused with empty class ?:
|
||||
* gimplify.c (gimplify_cond_expr): Use INIT_EXPR.
|
||||
|
||||
2019-03-05 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR target/89587
|
||||
|
@ -4024,11 +4024,11 @@ gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback)
|
||||
/* Build the new then clause, `tmp = then_;'. But don't build the
|
||||
assignment if the value is void; in C++ it can be if it's a throw. */
|
||||
if (!VOID_TYPE_P (TREE_TYPE (then_)))
|
||||
TREE_OPERAND (expr, 1) = build2 (MODIFY_EXPR, type, tmp, then_);
|
||||
TREE_OPERAND (expr, 1) = build2 (INIT_EXPR, type, tmp, then_);
|
||||
|
||||
/* Similarly, build the new else clause, `tmp = else_;'. */
|
||||
if (!VOID_TYPE_P (TREE_TYPE (else_)))
|
||||
TREE_OPERAND (expr, 2) = build2 (MODIFY_EXPR, type, tmp, else_);
|
||||
TREE_OPERAND (expr, 2) = build2 (INIT_EXPR, type, tmp, else_);
|
||||
|
||||
TREE_TYPE (expr) = void_type_node;
|
||||
recalculate_side_effects (expr);
|
||||
|
12
gcc/testsuite/g++.dg/init/empty2.C
Normal file
12
gcc/testsuite/g++.dg/init/empty2.C
Normal file
@ -0,0 +1,12 @@
|
||||
// PR c++/86485
|
||||
// { dg-additional-options -Wmaybe-uninitialized }
|
||||
|
||||
struct E {};
|
||||
struct S { S () {} E e; };
|
||||
void foo (S);
|
||||
|
||||
void
|
||||
bar (bool b)
|
||||
{
|
||||
foo (b ? S () : S ());
|
||||
}
|
Loading…
Reference in New Issue
Block a user