Commit 50867d20 by Jakub Jelinek Committed by Jakub Jelinek

cp-tree.h (cp_fully_fold_init): Declare.

	* 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
parent 69c5fdcf
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> 2018-12-19 Segher Boessenkool <segher@kernel.crashing.org>
* parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers * parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers
......
...@@ -2171,6 +2171,20 @@ cp_fully_fold (tree x) ...@@ -2171,6 +2171,20 @@ cp_fully_fold (tree x)
return cp_fold_rvalue (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 /* 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 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 never touch maybe_const, as it is only used for the C front-end
......
...@@ -7544,6 +7544,7 @@ extern bool cxx_omp_privatize_by_reference (const_tree); ...@@ -7544,6 +7544,7 @@ extern bool cxx_omp_privatize_by_reference (const_tree);
extern bool cxx_omp_disregard_value_expr (tree, bool); extern bool cxx_omp_disregard_value_expr (tree, bool);
extern void cp_fold_function (tree); extern void cp_fold_function (tree);
extern tree cp_fully_fold (tree); extern tree cp_fully_fold (tree);
extern tree cp_fully_fold_init (tree);
extern void clear_fold_cache (void); extern void clear_fold_cache (void);
extern tree lookup_hotness_attribute (tree); extern tree lookup_hotness_attribute (tree);
extern tree process_stmt_hotness_attribute (tree); extern tree process_stmt_hotness_attribute (tree);
......
...@@ -755,7 +755,7 @@ split_nonconstant_init (tree dest, tree init) ...@@ -755,7 +755,7 @@ split_nonconstant_init (tree dest, tree init)
init = TARGET_EXPR_INITIAL (init); init = TARGET_EXPR_INITIAL (init);
if (TREE_CODE (init) == CONSTRUCTOR) if (TREE_CODE (init) == CONSTRUCTOR)
{ {
init = cp_fully_fold (init); init = cp_fully_fold_init (init);
code = push_stmt_list (); code = push_stmt_list ();
if (split_nonconstant_init_1 (dest, init)) if (split_nonconstant_init_1 (dest, init))
init = NULL_TREE; init = NULL_TREE;
...@@ -863,7 +863,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags) ...@@ -863,7 +863,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
if (!const_init) if (!const_init)
value = oldval; value = oldval;
} }
value = cp_fully_fold (value); value = cp_fully_fold_init (value);
/* Handle aggregate NSDMI in non-constant initializers, too. */ /* Handle aggregate NSDMI in non-constant initializers, too. */
value = replace_placeholders (value, decl); value = replace_placeholders (value, decl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment