cp-tree.h (cp_fully_fold_init): Declare.
authorJakub Jelinek <jakub@redhat.com>
Thu, 20 Dec 2018 17:31:05 +0000 (18:31 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 20 Dec 2018 17:31:05 +0000 (18:31 +0100)
* cp-tree.h (cp_fully_fold_init): Declare.
* cp-gimplify.c (cp_fully_fold_init): New function.
* typeck2.c (split_nonconstant_init, store_init_value): Use it
instead of cp_fully_fold.

From-SVN: r267305

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

index 01d2f576c227cd9a2001d5651fcfbaa7047ab6d0..c1b7bba48e9514caa02e68515f4393026b1728c3 100644 (file)
@@ -1,3 +1,10 @@
+2018-12-20  Jakub Jelinek  <jakub@redhat.com>
+
+       * cp-tree.h (cp_fully_fold_init): Declare.
+       * cp-gimplify.c (cp_fully_fold_init): New function.
+       * typeck2.c (split_nonconstant_init, store_init_value): Use it
+       instead of cp_fully_fold.
+
 2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers
index d27e39c2a3a6a9ae3b67d52067aed79a11b78a39..9d848eaaef093e4799b170a20cdcd857e77a5463 100644 (file)
@@ -2171,6 +2171,20 @@ cp_fully_fold (tree x)
   return cp_fold_rvalue (x);
 }
 
+/* Likewise, but also fold recursively, which cp_fully_fold doesn't perform
+   in some cases.  */
+
+tree
+cp_fully_fold_init (tree x)
+{
+  if (processing_template_decl)
+    return x;
+  x = cp_fully_fold (x);
+  hash_set<tree> pset;
+  cp_walk_tree (&x, cp_fold_r, &pset, NULL);
+  return x;
+}
+
 /* c-common interface to cp_fold.  If IN_INIT, this is in a static initializer
    and certain changes are made to the folding done.  Or should be (FIXME).  We
    never touch maybe_const, as it is only used for the C front-end
index 8a9509564dca38e54a6e3cac100237403aa2bc15..f6b7c6e516b31e18c1a98c2909987d5774b2c30b 100644 (file)
@@ -7544,6 +7544,7 @@ extern bool cxx_omp_privatize_by_reference        (const_tree);
 extern bool cxx_omp_disregard_value_expr       (tree, bool);
 extern void cp_fold_function                   (tree);
 extern tree cp_fully_fold                      (tree);
+extern tree cp_fully_fold_init                 (tree);
 extern void clear_fold_cache                   (void);
 extern tree lookup_hotness_attribute           (tree);
 extern tree process_stmt_hotness_attribute     (tree);
index 209832b19ea9eda4745d3edf461c39b09d2757d1..cc9bf02439b607761421a159e3f17ba84b0cb5af 100644 (file)
@@ -755,7 +755,7 @@ split_nonconstant_init (tree dest, tree init)
     init = TARGET_EXPR_INITIAL (init);
   if (TREE_CODE (init) == CONSTRUCTOR)
     {
-      init = cp_fully_fold (init);
+      init = cp_fully_fold_init (init);
       code = push_stmt_list ();
       if (split_nonconstant_init_1 (dest, init))
        init = NULL_TREE;
@@ -863,7 +863,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
       if (!const_init)
        value = oldval;
     }
-  value = cp_fully_fold (value);
+  value = cp_fully_fold_init (value);
 
   /* Handle aggregate NSDMI in non-constant initializers, too.  */
   value = replace_placeholders (value, decl);