re PR c++/67523 (ICE with invalid combined simd inside of a template)
authorJakub Jelinek <jakub@redhat.com>
Thu, 10 Sep 2015 07:35:56 +0000 (09:35 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 10 Sep 2015 07:35:56 +0000 (09:35 +0200)
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

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/gomp/pr67523.C [new file with mode: 0644]

index 3be0e0aef751d4fbec8c72a4590a4fbbf241bc9f..fb9bbb787dc351194726ca15c66add50591112e6 100644 (file)
@@ -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.
index 5030318ddc87316fde0f2d7292a35705a330d18c..10f84d47ec26ebaec7c8a8a8cea58d82cfe6f9c8 100644 (file)
@@ -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;
     }
 
index d1d4cd4671ae3d2a865bdd1d5b7802fbaeeacf7c..8a06e5169d96f274327250e8450caed8d7dd2dd2 100644 (file)
@@ -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.
 
diff --git a/gcc/testsuite/g++.dg/gomp/pr67523.C b/gcc/testsuite/g++.dg/gomp/pr67523.C
new file mode 100644 (file)
index 0000000..fb12c8c
--- /dev/null
@@ -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);
+}