cp-tree.h (SIMPLE_TARGET_EXPR_P): New.
authorJason Merrill <jason@redhat.com>
Thu, 8 Oct 2015 16:14:03 +0000 (12:14 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 8 Oct 2015 16:14:03 +0000 (12:14 -0400)
* cp-tree.h (SIMPLE_TARGET_EXPR_P): New.
* init.c (get_nsdmi): Use it.
* typeck2.c (massage_init_elt): Use it.

From-SVN: r228606

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/init.c
gcc/cp/typeck2.c

index bf9b0c299717d03ca835dc60249c7e122576fd84..e89fd0229334505e3850eb1949fe1224614f4347 100644 (file)
@@ -1,3 +1,9 @@
+2015-10-08  Jason Merrill  <jason@redhat.com>
+
+       * cp-tree.h (SIMPLE_TARGET_EXPR_P): New.
+       * init.c (get_nsdmi): Use it.
+       * typeck2.c (massage_init_elt): Use it.
+
 2015-10-07  Jason Merrill  <jason@redhat.com>
 
        PR c++/67557
index 5acb065aba0169d62e2ceb08c3d7af993519b99b..f650c76c902e0e3993530ef0e1573a5c73fce5c8 100644 (file)
@@ -4490,6 +4490,12 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
 #define TARGET_EXPR_DIRECT_INIT_P(NODE) \
   TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE))
 
+/* True if NODE is a TARGET_EXPR that just expresses a copy of its INITIAL; if
+   the initializer has void type, it's doing something more complicated.  */
+#define SIMPLE_TARGET_EXPR_P(NODE)                             \
+  (TREE_CODE (NODE) == TARGET_EXPR                             \
+   && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (NODE))))
+
 /* True if EXPR expresses direct-initialization of a TYPE.  */
 #define DIRECT_INIT_EXPR_P(TYPE,EXPR)                                  \
   (TREE_CODE (EXPR) == TARGET_EXPR && TREE_LANG_FLAG_2 (EXPR)          \
index 1ed8f6c625e38f6dc51438b218a75d7bc4041cbb..57a640683519d4d93e9c1338a8009492a15f2564 100644 (file)
@@ -588,8 +588,7 @@ get_nsdmi (tree member, bool in_ctor)
        }
       /* Strip redundant TARGET_EXPR so we don't need to remap it, and
         so the aggregate init code below will see a CONSTRUCTOR.  */
-      if (init && TREE_CODE (init) == TARGET_EXPR
-         && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
+      if (init && SIMPLE_TARGET_EXPR_P (init))
        init = TARGET_EXPR_INITIAL (init);
       init = break_out_target_exprs (init);
     }
index 1d106c74995b06ee75965026959d8a37bbda7522..2c9143e63a2960cff3838360200b1082eb4f4d23 100644 (file)
@@ -1208,8 +1208,7 @@ massage_init_elt (tree type, tree init, tsubst_flags_t complain)
 {
   init = digest_init_r (type, init, true, LOOKUP_IMPLICIT, complain);
   /* Strip a simple TARGET_EXPR when we know this is an initializer.  */
-  if (TREE_CODE (init) == TARGET_EXPR
-      && !VOID_TYPE_P (TREE_TYPE (TARGET_EXPR_INITIAL (init))))
+  if (SIMPLE_TARGET_EXPR_P (init))
     init = TARGET_EXPR_INITIAL (init);
   /* When we defer constant folding within a statement, we may want to
      defer this folding as well.  */