Commit 78db7d92 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/43570 (OpenMP: Invalid read of size 1 (libgomp.fortran/vla6.f90))

	PR middle-end/43570
	* omp-low.c (scan_sharing_clauses): Don't scan_omp_op
	OMP_CLAUSE_DECL for OMP_CLAUSE_COPYPRIVATE.
	(lower_copyprivate_clauses): Use private var in outer
	context instead of original var.  Make sure the types
	are correct for VLAs.

	* testsuite/libgomp.fortran/vla8.f90: New test.

From-SVN: r158594
parent 11152c95
2010-04-21 Jakub Jelinek <jakub@redhat.com>
PR middle-end/43570
* omp-low.c (scan_sharing_clauses): Don't scan_omp_op
OMP_CLAUSE_DECL for OMP_CLAUSE_COPYPRIVATE.
(lower_copyprivate_clauses): Use private var in outer
context instead of original var. Make sure the types
are correct for VLAs.
2010-04-21 Richard Guenther <rguenther@suse.de> 2010-04-21 Richard Guenther <rguenther@suse.de>
* tree-ssa-structalias.c (do_ds_constraint): Avoid escaping * tree-ssa-structalias.c (do_ds_constraint): Avoid escaping
......
...@@ -1433,10 +1433,6 @@ scan_sharing_clauses (tree clauses, omp_context *ctx) ...@@ -1433,10 +1433,6 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
break; break;
case OMP_CLAUSE_COPYPRIVATE: case OMP_CLAUSE_COPYPRIVATE:
if (ctx->outer)
scan_omp_op (&OMP_CLAUSE_DECL (c), ctx->outer);
/* FALLTHRU */
case OMP_CLAUSE_COPYIN: case OMP_CLAUSE_COPYIN:
decl = OMP_CLAUSE_DECL (c); decl = OMP_CLAUSE_DECL (c);
by_ref = use_pointer_for_field (decl, NULL); by_ref = use_pointer_for_field (decl, NULL);
...@@ -2702,7 +2698,7 @@ lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist, ...@@ -2702,7 +2698,7 @@ lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist,
for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c)) for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
{ {
tree var, ref, x; tree var, new_var, ref, x;
bool by_ref; bool by_ref;
location_t clause_loc = OMP_CLAUSE_LOCATION (c); location_t clause_loc = OMP_CLAUSE_LOCATION (c);
...@@ -2713,17 +2709,29 @@ lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist, ...@@ -2713,17 +2709,29 @@ lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist,
by_ref = use_pointer_for_field (var, NULL); by_ref = use_pointer_for_field (var, NULL);
ref = build_sender_ref (var, ctx); ref = build_sender_ref (var, ctx);
x = lookup_decl_in_outer_ctx (var, ctx); x = new_var = lookup_decl_in_outer_ctx (var, ctx);
x = by_ref ? build_fold_addr_expr_loc (clause_loc, x) : x; if (by_ref)
{
x = build_fold_addr_expr_loc (clause_loc, new_var);
x = fold_convert_loc (clause_loc, TREE_TYPE (ref), x);
}
gimplify_assign (ref, x, slist); gimplify_assign (ref, x, slist);
ref = build_receiver_ref (var, by_ref, ctx); ref = build_receiver_ref (var, false, ctx);
if (by_ref)
{
ref = fold_convert_loc (clause_loc,
build_pointer_type (TREE_TYPE (new_var)),
ref);
ref = build_fold_indirect_ref_loc (clause_loc, ref);
}
if (is_reference (var)) if (is_reference (var))
{ {
ref = fold_convert_loc (clause_loc, TREE_TYPE (new_var), ref);
ref = build_fold_indirect_ref_loc (clause_loc, ref); ref = build_fold_indirect_ref_loc (clause_loc, ref);
var = build_fold_indirect_ref_loc (clause_loc, var); new_var = build_fold_indirect_ref_loc (clause_loc, new_var);
} }
x = lang_hooks.decls.omp_clause_assign_op (c, var, ref); x = lang_hooks.decls.omp_clause_assign_op (c, new_var, ref);
gimplify_and_add (x, rlist); gimplify_and_add (x, rlist);
} }
} }
......
2010-04-21 Jakub Jelinek <jakub@redhat.com>
PR middle-end/43570
* testsuite/libgomp.fortran/vla8.f90: New test.
2010-04-20 Jakub Jelinek <jakub@redhat.com> 2010-04-20 Jakub Jelinek <jakub@redhat.com>
PR libgomp/43706 PR libgomp/43706
......
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