@@ -1252,8 +1252,8 @@ extern tree c_omp_check_context_selector (location_t, tree);
extern void c_omp_mark_declare_variant (location_t, tree, tree);
extern const char *c_omp_map_clause_name (tree, bool);
extern void c_omp_adjust_map_clauses (tree, bool);
-struct omp_mapper_list;
-extern void c_omp_find_nested_mappers (struct omp_mapper_list *, tree);
+template<typename T> struct omp_mapper_list;
+extern void c_omp_find_nested_mappers (struct omp_mapper_list<tree> *, tree);
extern tree c_omp_instantiate_mappers (tree);
class c_omp_address_inspector
@@ -3401,7 +3401,7 @@ c_omp_address_inspector::get_attachment_point (tree expr)
themselves, add it to MLIST. */
void
-c_omp_find_nested_mappers (omp_mapper_list *mlist, tree mapper_fn)
+c_omp_find_nested_mappers (omp_mapper_list<tree> *mlist, tree mapper_fn)
{
tree mapper = lang_hooks.decls.omp_extract_mapper_directive (mapper_fn);
tree mapper_name = NULL_TREE;
@@ -12562,7 +12562,7 @@ static tree
c_omp_scan_mapper_bindings_r (tree *tp, int *walk_subtrees, void *ptr)
{
tree t = *tp;
- omp_mapper_list *mlist = (omp_mapper_list *) ptr;
+ omp_mapper_list<tree> *mlist = (omp_mapper_list<tree> *) ptr;
tree aggr_type = NULL_TREE;
if (TREE_CODE (t) == SIZEOF_EXPR
@@ -12600,9 +12600,9 @@ c_omp_scan_mapper_bindings_r (tree *tp, int *walk_subtrees, void *ptr)
void
c_omp_scan_mapper_bindings (location_t loc, tree *clauses_ptr, tree body)
{
- hash_set<omp_name_type> seen_types;
+ hash_set<omp_name_type<tree>> seen_types;
auto_vec<tree> mappers;
- omp_mapper_list mlist (&seen_types, &mappers);
+ omp_mapper_list<tree> mlist (&seen_types, &mappers);
walk_tree_without_duplicates (&body, c_omp_scan_mapper_bindings_r, &mlist);
@@ -9455,7 +9455,7 @@ struct omp_target_walk_data
variables when recording lambda_objects_accessed. */
hash_set<tree> local_decls;
- omp_mapper_list *mappers;
+ omp_mapper_list<tree> *mappers;
};
/* Helper function of finish_omp_target_clauses, called via
@@ -9469,7 +9469,7 @@ finish_omp_target_clauses_r (tree *tp, int *walk_subtrees, void *ptr)
struct omp_target_walk_data *data = (struct omp_target_walk_data *) ptr;
tree current_object = data->current_object;
tree current_closure = data->current_closure;
- omp_mapper_list *mlist = data->mappers;
+ omp_mapper_list<tree> *mlist = data->mappers;
tree aggr_type = NULL_TREE;
/* References inside of these expression codes shouldn't incur any
@@ -9603,9 +9603,9 @@ finish_omp_target_clauses (location_t loc, tree body, tree *clauses_ptr)
else
data.current_closure = NULL_TREE;
- hash_set<omp_name_type> seen_types;
+ hash_set<omp_name_type<tree> > seen_types;
auto_vec<tree> mapper_fns;
- omp_mapper_list mlist (&seen_types, &mapper_fns);
+ omp_mapper_list<tree> mlist (&seen_types, &mapper_fns);
data.mappers = &mlist;
cp_walk_tree_without_duplicates (&body, finish_omp_target_clauses_r, &data);
@@ -219,7 +219,7 @@ struct gimplify_omp_ctx
{
struct gimplify_omp_ctx *outer_context;
splay_tree variables;
- hash_map<omp_name_type, tree> *implicit_mappers;
+ hash_map<omp_name_type<tree>, tree> *implicit_mappers;
hash_set<tree> *privatized_types;
tree clauses;
/* Iteration variables in an OMP_FOR. */
@@ -452,7 +452,7 @@ new_omp_context (enum omp_region_type region_type)
c = XCNEW (struct gimplify_omp_ctx);
c->outer_context = gimplify_omp_ctxp;
c->variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
- c->implicit_mappers = new hash_map<omp_name_type, tree>;
+ c->implicit_mappers = new hash_map<omp_name_type<tree>, tree>;
c->privatized_types = new hash_set<tree>;
c->location = input_location;
c->region_type = region_type;
@@ -10434,7 +10434,7 @@ remap_mapper_decl_1 (tree *tp, int *walk_subtrees, void *data)
}
static tree *
-omp_instantiate_mapper (hash_map<omp_name_type, tree> *implicit_mappers,
+omp_instantiate_mapper (hash_map<omp_name_type<tree>, tree> *implicit_mappers,
tree mapper, tree expr, enum gomp_map_kind outer_kind,
tree *mapper_clauses_p)
{
@@ -149,21 +149,22 @@ get_openacc_privatization_dump_flags ()
return l_dump_flags;
}
+template <typename T>
struct omp_name_type
{
tree name;
- tree type;
+ T type;
};
template <>
-struct default_hash_traits <omp_name_type>
- : typed_noop_remove <omp_name_type>
+struct default_hash_traits <omp_name_type<tree> >
+ : typed_noop_remove <omp_name_type<tree> >
{
- GTY((skip)) typedef omp_name_type value_type;
- GTY((skip)) typedef omp_name_type compare_type;
+ GTY((skip)) typedef omp_name_type<tree> value_type;
+ GTY((skip)) typedef omp_name_type<tree> compare_type;
static hashval_t
- hash (omp_name_type p)
+ hash (omp_name_type<tree> p)
{
return p.name ? iterative_hash_expr (p.name, TYPE_UID (p.type))
: TYPE_UID (p.type);
@@ -172,19 +173,19 @@ struct default_hash_traits <omp_name_type>
static const bool empty_zero_p = true;
static bool
- is_empty (omp_name_type p)
+ is_empty (omp_name_type<tree> p)
{
return p.type == NULL;
}
static bool
- is_deleted (omp_name_type)
+ is_deleted (omp_name_type<tree>)
{
return false;
}
static bool
- equal (const omp_name_type &a, const omp_name_type &b)
+ equal (const omp_name_type<tree> &a, const omp_name_type<tree> &b)
{
if (a.name == NULL_TREE && b.name == NULL_TREE)
return a.type == b.type;
@@ -195,27 +196,28 @@ struct default_hash_traits <omp_name_type>
}
static void
- mark_empty (omp_name_type &e)
+ mark_empty (omp_name_type<tree> &e)
{
e.type = NULL;
}
};
+template <typename T>
struct omp_mapper_list
{
- hash_set<omp_name_type> *seen_types;
+ hash_set<omp_name_type<T>> *seen_types;
vec<tree> *mappers;
- omp_mapper_list (hash_set<omp_name_type> *s, vec<tree> *m)
+ omp_mapper_list (hash_set<omp_name_type<T>> *s, vec<tree> *m)
: seen_types (s), mappers (m) { }
- void add_mapper (tree name, tree type, tree mapperfn)
+ void add_mapper (tree name, T type, tree mapperfn)
{
/* We can't hash a NULL_TREE... */
if (!name)
name = void_node;
- omp_name_type n_t = { name, type };
+ omp_name_type<T> n_t = { name, type };
if (seen_types->contains (n_t))
return;
@@ -224,7 +226,7 @@ struct omp_mapper_list
mappers->safe_push (mapperfn);
}
- bool contains (tree name, tree type)
+ bool contains (tree name, T type)
{
if (!name)
name = void_node;