}
}
+/* Helper for emit_partial_init_fini_fn OpenMP target handling, called via
+ walk_tree. Set DECL_CONTEXT on any automatic temporaries which still
+ have it NULL to id->src_fn, so that later copy_tree_body_r can remap those.
+ Otherwise DECL_CONTEXT would be set only during gimplification of the host
+ fn and when copy_tree_body_r doesn't remap those, we'd ICE during the
+ target fn gimplification because the same automatic VAR_DECL can't be
+ used in multiple functions (with the exception of nested functions). */
+
+static tree
+set_context_for_auto_vars_r (tree *tp, int *, void *data)
+{
+ copy_body_data *id = (copy_body_data *) data;
+ if (auto_var_in_fn_p (*tp, NULL_TREE) && DECL_ARTIFICIAL (*tp))
+ DECL_CONTEXT (*tp) = id->src_fn;
+ return NULL_TREE;
+}
+
/* Generate code to do the initialization or destruction of the decls in VARS,
a TREE_LIST of VAR_DECL with static storage duration.
Whether initialization or destruction is performed is specified by INITP. */
id.transform_new_cfg = true;
id.transform_return_to_modify = false;
id.eh_lp_nr = 0;
+ walk_tree (&init, set_context_for_auto_vars_r, &id, NULL);
walk_tree (&init, copy_tree_body_r, &id, NULL);
}
/* Do one initialization or destruction. */