On 3/25/21 4:33 PM, Jakub Jelinek wrote:
On Thu, Mar 25, 2021 at 04:20:54PM -0400, Jason Merrill wrote:
but it is also cp_walk_subtrees DECL_EXPR handling:
case DECL_EXPR:
/* User variables should be mentioned in BIND_EXPR_VARS
and their initializers and sizes walked when walking
the containing BIND_EXPR. Compiler temporaries are
handled here. And also normal variables in templates,
since do_poplevel doesn't build a BIND_EXPR then. */
if (VAR_P (TREE_OPERAND (*tp, 0))
&& (processing_template_decl
|| (DECL_ARTIFICIAL (TREE_OPERAND (*tp, 0))
&& !TREE_STATIC (TREE_OPERAND (*tp, 0)))))
{
What if we WALK_SUBTREE (DECL_EXPR_DECL (*tp)) here, instead of the
bot_replace hunk? OK either way.
The above hunk is cp_walk_subtrees, we shouldn't change that IMO.
We could do it in bot_manip instead of bot_replace by doing roughly:
if (TREE_CODE (*tp) == DECL_EXPR
&& VAR_P (DECL_EXPR_DECL (*tp))
&& DECL_ARTIFICIAL (DECL_EXPR_DECL (*tp))
&& !TREE_STATIC (DECL_EXPR_DECL (*tp)))
{
tree t;
splay_tree_node n
= splay_tree_lookup (target_remap,
(splay_tree_key) DECL_EXPR_DECL (*tp));
if (n)
t = (tree) n->value;
else
{
t = create_temporary_var (TREE_TYPE (DECL_EXPR_DECL (*tp)));
DECL_INITIAL (t) = DECL_INITIAL (DECL_EXPR_DECL (*tp));
splay_tree_insert (target_remap,
(splay_tree_key) DECL_EXPR_DECL (*tp),
(splay_tree_value) t);
}
copy_tree_r (tp, walk_subtrees, NULL);
DECL_EXPR_DECL (*tp) = t;
if (data.clear_location && EXPR_HAS_LOCATION (*tp))
SET_EXPR_LOCATION (*tp, input_location);
return NULL_TREE;
}
plus the current BIND_EXPR handling afterwards. I.e. update
DECL_EXPR_DECL of the DECL_EXPR right away in bot_manip rather than
waiting until bot_replace with that.
If you prefer that, I can test it tonight.
Sure, let's go with this version.
Jason