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:
parent
7da8534d1e
commit
9ce1688bb8
@ -1,5 +1,9 @@
|
||||
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
|
||||
* gimplify.c (gimplify_omp_for): Don't call omp_add_variable
|
||||
if decl is already in outer->variables.
|
||||
|
@ -7001,7 +7001,7 @@ find_combined_omp_for (tree *tp, int *walk_subtrees, void *)
|
||||
static enum gimplify_status
|
||||
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 tret;
|
||||
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,
|
||||
simd ? ORT_SIMD : ORT_WORKSHARE);
|
||||
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)
|
||||
{
|
||||
gcc_assert (TREE_CODE (for_stmt) != OACC_LOOP);
|
||||
for_stmt = walk_tree (&OMP_FOR_BODY (for_stmt), find_combined_omp_for,
|
||||
NULL, NULL);
|
||||
gcc_assert (for_stmt != NULL_TREE);
|
||||
for_stmt = inner_for_stmt;
|
||||
gimplify_omp_ctxp->combined_loop = true;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,8 @@
|
||||
2015-09-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/67523
|
||||
* g++.dg/gomp/pr67523.C: New test.
|
||||
|
||||
PR c++/67522
|
||||
* g++.dg/gomp/pr67522.C: New test.
|
||||
|
||||
|
29
gcc/testsuite/g++.dg/gomp/pr67523.C
Normal file
29
gcc/testsuite/g++.dg/gomp/pr67523.C
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user