Fix potential ICE (null pointer dereference) in omp-low.c:diagnose_sb_0.
authortschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Feb 2014 14:46:08 +0000 (14:46 +0000)
committertschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Feb 2014 14:46:08 +0000 (14:46 +0000)
gcc/
* omp-low.c (diagnose_sb_0): Make sure label_ctx is valid to
dereference.
gcc/testsuite/
* gcc.dg/cilk-plus/jump-openmp.c: New file.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207722 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cilk-plus/jump-openmp.c [new file with mode: 0644]

index fc720dc..78bf506 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-12  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * omp-low.c (diagnose_sb_0): Make sure label_ctx is valid to
+       dereference.
+
 2014-02-12  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/arm/aarch-cost-tables.h (generic_extra_costs): Fix
index f99b2a6..ff3d2e8 100644 (file)
@@ -10269,7 +10269,8 @@ diagnose_sb_0 (gimple_stmt_iterator *gsi_p,
       if ((branch_ctx
           && gimple_code (branch_ctx) == GIMPLE_OMP_FOR
           && gimple_omp_for_kind (branch_ctx) == GF_OMP_FOR_KIND_CILKSIMD)
-         || (gimple_code (label_ctx) == GIMPLE_OMP_FOR
+         || (label_ctx
+             && gimple_code (label_ctx) == GIMPLE_OMP_FOR
              && gimple_omp_for_kind (label_ctx) == GF_OMP_FOR_KIND_CILKSIMD))
        cilkplus_block = true;
     }
index c87966d..46d5ff8 100644 (file)
@@ -1,3 +1,7 @@
+2014-02-12  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * gcc.dg/cilk-plus/jump-openmp.c: New file.
+
 2014-02-12  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/60092
diff --git a/gcc/testsuite/gcc.dg/cilk-plus/jump-openmp.c b/gcc/testsuite/gcc.dg/cilk-plus/jump-openmp.c
new file mode 100644 (file)
index 0000000..95e6b2d
--- /dev/null
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-options "-fcilkplus -fopenmp" } */
+/* { dg-require-effective-target fopenmp } */
+
+int *a, *b, c;
+
+void foo()
+{
+#pragma simd
+  for (int i=0; i < 1000; ++i)
+    {
+      a[i] = b[i];
+      if (c == 5)
+       return; /* { dg-error "invalid branch to/from a Cilk Plus structured block" } */
+    }
+}
+
+void bar()
+{
+#pragma simd
+  for (int i=0; i < 1000; ++i)
+    {
+    lab:
+      a[i] = b[i];
+    }
+  if (c == 6)
+    goto lab; /* { dg-error "invalid entry to Cilk Plus structured block" } */
+}
+
+void baz()
+{
+  bad1:
+  #pragma omp parallel
+    goto bad1; /* { dg-error "invalid branch to/from an OpenMP structured block" } */
+
+  goto bad2; /* { dg-error "invalid entry to OpenMP structured block" } */
+  #pragma omp parallel
+    {
+      bad2: ;
+    }
+
+  #pragma omp parallel
+    {
+      int i;
+      goto ok1;
+      for (i = 0; i < 10; ++i)
+       { ok1: break; }
+    }
+}