re PR c++/67523 (ICE with invalid combined simd inside of a template)

PR c++/67523
	* gimplify.c (gimplify_omp_for): If inner stmt is not found
	for combined loop, assert seen_error () and return GS_ERROR.

	* g++.dg/gomp/pr67523.C: New test.

From-SVN: r227611
This commit is contained in:
Jakub Jelinek 2015-09-10 09:35:56 +02:00 committed by Jakub Jelinek
parent 7da8534d1e
commit 9ce1688bb8
4 changed files with 51 additions and 5 deletions

View File

@ -1,5 +1,9 @@
2015-09-10 Jakub Jelinek <jakub@redhat.com> 2015-09-10 Jakub Jelinek <jakub@redhat.com>
PR c++/67523
* gimplify.c (gimplify_omp_for): If inner stmt is not found
for combined loop, assert seen_error () and return GS_ERROR.
PR middle-end/67521 PR middle-end/67521
* gimplify.c (gimplify_omp_for): Don't call omp_add_variable * gimplify.c (gimplify_omp_for): Don't call omp_add_variable
if decl is already in outer->variables. if decl is already in outer->variables.

View File

@ -7001,7 +7001,7 @@ find_combined_omp_for (tree *tp, int *walk_subtrees, void *)
static enum gimplify_status static enum gimplify_status
gimplify_omp_for (tree *expr_p, gimple_seq *pre_p) gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
{ {
tree for_stmt, orig_for_stmt, decl, var, t; tree for_stmt, orig_for_stmt, inner_for_stmt = NULL_TREE, decl, var, t;
enum gimplify_status ret = GS_ALL_DONE; enum gimplify_status ret = GS_ALL_DONE;
enum gimplify_status tret; enum gimplify_status tret;
gomp_for *gfor; gomp_for *gfor;
@ -7044,6 +7044,19 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
} }
} }
if (OMP_FOR_INIT (for_stmt) == NULL_TREE)
{
gcc_assert (TREE_CODE (for_stmt) != OACC_LOOP);
inner_for_stmt = walk_tree (&OMP_FOR_BODY (for_stmt),
find_combined_omp_for, NULL, NULL);
if (inner_for_stmt == NULL_TREE)
{
gcc_assert (seen_error ());
*expr_p = NULL_TREE;
return GS_ERROR;
}
}
gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p, gimplify_scan_omp_clauses (&OMP_FOR_CLAUSES (for_stmt), pre_p,
simd ? ORT_SIMD : ORT_WORKSHARE); simd ? ORT_SIMD : ORT_WORKSHARE);
if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE) if (TREE_CODE (for_stmt) == OMP_DISTRIBUTE)
@ -7079,10 +7092,7 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
if (OMP_FOR_INIT (for_stmt) == NULL_TREE) if (OMP_FOR_INIT (for_stmt) == NULL_TREE)
{ {
gcc_assert (TREE_CODE (for_stmt) != OACC_LOOP); for_stmt = inner_for_stmt;
for_stmt = walk_tree (&OMP_FOR_BODY (for_stmt), find_combined_omp_for,
NULL, NULL);
gcc_assert (for_stmt != NULL_TREE);
gimplify_omp_ctxp->combined_loop = true; gimplify_omp_ctxp->combined_loop = true;
} }

View File

@ -1,5 +1,8 @@
2015-09-10 Jakub Jelinek <jakub@redhat.com> 2015-09-10 Jakub Jelinek <jakub@redhat.com>
PR c++/67523
* g++.dg/gomp/pr67523.C: New test.
PR c++/67522 PR c++/67522
* g++.dg/gomp/pr67522.C: New test. * g++.dg/gomp/pr67522.C: New test.

View File

@ -0,0 +1,29 @@
// PR c++/67523
// { dg-do compile }
// { dg-options "-fopenmp" }
struct S { int s; };
template <typename T>
void foo (T &x, T &y)
{
#pragma omp for simd
for (T i = x; i < y; i++) // { dg-error "used with class iteration variable" }
;
#pragma omp parallel for simd
for (T i = x; i < y; i++) // { dg-error "used with class iteration variable" }
;
#pragma omp target teams distribute parallel for simd
for (T i = x; i < y; i++) // { dg-error "used with class iteration variable" }
;
#pragma omp target teams distribute simd
for (T i = x; i < y; i++) // { dg-error "used with class iteration variable" }
;
}
void
bar ()
{
S x, y;
foo <S> (x, y);
}