From 507318f109624f58d4bf554c3ad284cdf09324e3 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 5 Mar 2019 17:20:41 -0500 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/gimplify.c | 4 ++-- gcc/testsuite/g++.dg/init/empty2.C | 12 ++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/empty2.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 405bc38fb75..df50f599d1a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-03-02 Jason Merrill + + PR c++/86485 - -Wmaybe-unused with empty class ?: + * gimplify.c (gimplify_cond_expr): Use INIT_EXPR. + 2019-03-05 Jakub Jelinek PR target/89587 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 983635ba21f..fa85b1c86de 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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); diff --git a/gcc/testsuite/g++.dg/init/empty2.C b/gcc/testsuite/g++.dg/init/empty2.C new file mode 100644 index 00000000000..f0d8e3fec01 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/empty2.C @@ -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 ()); +} -- 2.30.2