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.
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;
}
}
+ 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)
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;
}
--- /dev/null
+// 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);
+}