@@ -10865,7 +10865,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;
}
new file mode 100644
@@ -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; }
+ }
+}
> /* If it's obvious we have an invalid entry, be specific about the error. */
> if (branch_ctx == NULL)
> - error ("invalid entry to OpenMP structured block");
> + {
> + if (cilkplus_block)
> + error ("invalid entry to Cilk Plus structured block");
> + else
> + error ("invalid entry to OpenMP structured block");
> + }
> else
> - /* Otherwise, be vague and lazy, but efficient. */
> - error ("invalid branch to/from an OpenMP structured block");
> + {
> + /* Otherwise, be vague and lazy, but efficient. */
> + if (cilkplus_block)
> + error ("invalid branch to/from a Cilk Plus structured block");
> + else
> + error ("invalid branch to/from an OpenMP structured block");
> + }
In fact, and keeping in mind that we're currently adding OpenACC support,
I'd suggest to do this differently; OK for trunk and gomp-4_0-branch?
commit 367dabfcc94a3e96d63b48c38d0dd94ca9f517f8
Author: Thomas Schwinge <thomas@codesourcery.com>
Date: Fri Dec 6 19:23:47 2013 +0100
Generalize diagnose_omp_blocks' structured block logic.
gcc/
* omp-low.c (diagnose_sb_0): Generalize detection which kind of
structured block we're in.
gcc/testsuite/
* g++.dg/gomp/block-1.C: Adjust to changed error message and/or
be tighten matching rules.
* g++.dg/gomp/block-2.C: Likewise.
* g++.dg/gomp/block-3.C: Likewise.
* g++.dg/gomp/block-5.C: Likewise.
* g++.dg/gomp/target-1.C: Likewise.
* g++.dg/gomp/target-2.C: Likewise.
* g++.dg/gomp/taskgroup-1.C: Likewise.
* g++.dg/gomp/teams-1.C: Likewise.
* gcc.dg/cilk-plus/jump-openmp.c: Likewise.
* gcc.dg/cilk-plus/jump.c: Likewise.
* gcc.dg/gomp/block-1.c: Likewise.
* gcc.dg/gomp/block-10.c: Likewise.
* gcc.dg/gomp/block-2.c: Likewise.
* gcc.dg/gomp/block-3.c: Likewise.
* gcc.dg/gomp/block-4.c: Likewise.
* gcc.dg/gomp/block-5.c: Likewise.
* gcc.dg/gomp/block-6.c: Likewise.
* gcc.dg/gomp/block-7.c: Likewise.
* gcc.dg/gomp/block-8.c: Likewise.
* gcc.dg/gomp/block-9.c: Likewise.
* gcc.dg/gomp/target-1.c: Likewise.
* gcc.dg/gomp/target-2.c: Likewise.
* gcc.dg/gomp/taskgroup-1.c: Likewise.
* gcc.dg/gomp/teams-1.c: Likewise.
@@ -10822,6 +10822,23 @@ diagnose_sb_0 (gimple_stmt_iterator *gsi_p,
if (label_ctx == branch_ctx)
return false;
+ const char* kind = NULL;
+
+ if (flag_enable_cilkplus)
+ {
+ if ((branch_ctx
+ && gimple_code (branch_ctx) == GIMPLE_OMP_FOR
+ && gimple_omp_for_kind (branch_ctx) == GF_OMP_FOR_KIND_CILKSIMD)
+ || (label_ctx
+ && gimple_code (label_ctx) == GIMPLE_OMP_FOR
+ && gimple_omp_for_kind (label_ctx) == GF_OMP_FOR_KIND_CILKSIMD))
+ kind = "Cilk Plus";
+ }
+ if (kind == NULL)
+ {
+ gcc_assert (flag_openmp);
+ kind = "OpenMP";
+ }
/*
Previously we kept track of the label's entire context in diagnose_sb_[12]
@@ -10854,38 +10871,18 @@ diagnose_sb_0 (gimple_stmt_iterator *gsi_p,
}
if (exit_p)
- error ("invalid exit from OpenMP structured block");
+ error ("invalid exit from %s structured block", kind);
else
- error ("invalid entry to OpenMP structured block");
+ error ("invalid entry to %s structured block", kind);
#endif
- bool cilkplus_block = false;
- if (flag_enable_cilkplus)
- {
- if ((branch_ctx
- && gimple_code (branch_ctx) == GIMPLE_OMP_FOR
- && gimple_omp_for_kind (branch_ctx) == GF_OMP_FOR_KIND_CILKSIMD)
- || (label_ctx
- && gimple_code (label_ctx) == GIMPLE_OMP_FOR
- && gimple_omp_for_kind (label_ctx) == GF_OMP_FOR_KIND_CILKSIMD))
- cilkplus_block = true;
- }
-
/* If it's obvious we have an invalid entry, be specific about the error. */
if (branch_ctx == NULL)
- {
- if (cilkplus_block)
- error ("invalid entry to Cilk Plus structured block");
- else
- error ("invalid entry to OpenMP structured block");
- }
+ error ("invalid entry to %s structured block", kind);
else
{
/* Otherwise, be vague and lazy, but efficient. */
- if (cilkplus_block)
- error ("invalid branch to/from a Cilk Plus structured block");
- else
- error ("invalid branch to/from an OpenMP structured block");
+ error ("invalid branch to/from %s structured block", kind);
}
gsi_replace (gsi_p, gimple_build_nop (), false);
@@ -21,5 +21,5 @@ void foo()
}
}
-// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 7 }
+// { dg-message "error: invalid branch to/from OpenMP structured block" "" { target *-*-* } 7 }
// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 9 }
@@ -31,5 +31,5 @@ void foo()
continue;
}
-// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 14 }
+// { dg-message "error: invalid branch to/from OpenMP structured block" "" { target *-*-* } 14 }
// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 16 }
@@ -58,6 +58,6 @@ void foo()
}
}
-// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 21 }
-// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 26 }
+// { dg-message "error: invalid branch to/from OpenMP structured block" "" { target *-*-* } 21 }
+// { dg-message "error: invalid branch to/from OpenMP structured block" "" { target *-*-* } 26 }
// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 30 }
@@ -14,4 +14,4 @@ void foo()
}
}
-// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 7 }
+// { dg-message "error: invalid branch to/from OpenMP structured block" "" { target *-*-* } 7 }
@@ -28,5 +28,5 @@ foo (int x)
}
}
-// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid branch to/from OpenMP structured block" "" { target *-*-* } 8 }
// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
@@ -28,5 +28,5 @@ foo (int x, int y)
}
}
-// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid branch to/from OpenMP structured block" "" { target *-*-* } 8 }
// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
@@ -28,5 +28,5 @@ foo (int x)
}
}
-// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid branch to/from OpenMP structured block" "" { target *-*-* } 8 }
// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
@@ -60,7 +60,7 @@ bar (int x)
}
}
-// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 8 }
+// { dg-error "invalid branch to/from OpenMP structured block" "" { target *-*-* } 8 }
// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 10 }
-// { dg-error "invalid branch to/from an OpenMP structured block" "" { target *-*-* } 37 }
+// { dg-error "invalid branch to/from OpenMP structured block" "" { target *-*-* } 37 }
// { dg-error "invalid entry to OpenMP structured block" "" { target *-*-* } 39 }
@@ -11,7 +11,7 @@ void foo()
{
a[i] = b[i];
if (c == 5)
- return; /* { dg-error "invalid branch to/from a Cilk Plus structured block" } */
+ return; /* { dg-error "invalid branch to/from Cilk Plus structured block" } */
}
}
@@ -31,7 +31,7 @@ void baz()
{
bad1:
#pragma omp parallel
- goto bad1; /* { dg-error "invalid branch to/from an OpenMP structured block" } */
+ goto bad1; /* { dg-error "invalid branch to/from OpenMP structured block" } */
goto bad2; /* { dg-error "invalid entry to OpenMP structured block" } */
#pragma omp parallel
@@ -10,7 +10,7 @@ void foo()
{
a[i] = b[i];
if (c == 5)
- return; /* { dg-error "invalid branch to.from a Cilk" } */
+ return; /* { dg-error "invalid branch to/from Cilk Plus structured block" } */
}
}
@@ -23,5 +23,5 @@ void bar()
a[i] = b[i];
}
if (c == 6)
- goto lab; /* { dg-error "invalid entry to Cilk Plus" } */
+ goto lab; /* { dg-error "invalid entry to Cilk Plus structured block" } */
}
@@ -4,9 +4,9 @@ void foo()
{
bad1:
#pragma omp parallel
- goto bad1; // { dg-error "invalid branch" }
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; // { dg-error "invalid entry" }
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp parallel
{
bad2: ;
@@ -3,28 +3,28 @@
void foo(int i)
{
int j;
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp parallel
{ case 0:; }
}
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp for
for (j = 0; j < 10; ++ j)
{ case 1:; }
}
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp critical
{ case 2:; }
}
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp master
{ case 3:; }
}
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp sections
{ case 4:;
@@ -32,7 +32,7 @@ void foo(int i)
{ case 5:; }
}
}
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp ordered
{ default:; }
@@ -11,9 +11,9 @@ void foo()
bad1:
#pragma omp for
for (i = 0; i < 10; ++i)
- goto bad1; // { dg-error "invalid branch" }
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; // { dg-error "invalid entry" }
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp for
for (i = 0; i < 10; ++i)
{
@@ -18,16 +18,16 @@ void foo()
#pragma omp section
{ bad1: ; }
#pragma omp section
- goto bad1; // { dg-error "invalid branch" }
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
}
#pragma omp sections
{
- goto bad2; // { dg-error "invalid branch" }
+ goto bad2; // { dg-error "invalid branch to/from OpenMP structured block" }
}
bad2:;
- goto bad3; // { dg-error "invalid entry" }
+ goto bad3; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp sections
{
bad3: ;
@@ -4,6 +4,6 @@ void foo()
{
#pragma omp critical
{
- return; // { dg-error "invalid branch" }
+ return; // { dg-error "invalid branch to/from OpenMP structured block" }
}
}
@@ -4,12 +4,12 @@ void foo()
{
#pragma omp master
{
- goto bad1; // { dg-error "invalid branch" }
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
}
#pragma omp master
{
bad1:
- return; // { dg-error "invalid branch" }
+ return; // { dg-error "invalid branch to/from OpenMP structured block" }
}
}
@@ -4,6 +4,6 @@ void foo()
{
#pragma omp ordered
{
- return; // { dg-error "invalid branch" }
+ return; // { dg-error "invalid branch to/from OpenMP structured block" }
}
}
@@ -6,15 +6,15 @@ void foo()
for (i = 0; i < 10; ++i)
{
#pragma omp for
- for (j = ({ continue; 0; }); // { dg-error "invalid branch" }
- j < ({ continue; 10; }); // { dg-error "invalid branch" }
- j += ({ continue; 1; })) // { dg-error "invalid branch" }
+ for (j = ({ continue; 0; }); // { dg-error "invalid branch to/from OpenMP structured block" }
+ j < ({ continue; 10; }); // { dg-error "invalid branch to/from OpenMP structured block" }
+ j += ({ continue; 1; })) // { dg-error "invalid branch to/from OpenMP structured block" }
continue;
#pragma omp for
- for (j = ({ break; 0; }); // { dg-error "invalid branch" }
- j < ({ break; 10; }); // { dg-error "invalid branch" }
- j += ({ break; 1; })) // { dg-error "invalid branch" }
+ for (j = ({ break; 0; }); // { dg-error "invalid branch to/from OpenMP structured block" }
+ j < ({ break; 10; }); // { dg-error "invalid branch to/from OpenMP structured block" }
+ j += ({ break; 1; })) // { dg-error "invalid branch to/from OpenMP structured block" }
break; // { dg-error "break" }
}
}
@@ -7,5 +7,5 @@ int foo()
#pragma omp parallel for
for (i = 0; i < 10; ++i)
- return 0; // { dg-error "invalid branch" }
+ return 0; // { dg-error "invalid branch to/from OpenMP structured block" }
}
@@ -3,7 +3,7 @@
void foo(int i)
{
int j;
- switch (i) // { dg-error "invalid entry" }
+ switch (i) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp parallel
{ case 0:; }
@@ -5,9 +5,9 @@ foo (int x)
{
bad1:
#pragma omp target
- goto bad1; /* { dg-error "invalid branch" } */
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; /* { dg-error "invalid entry" } */
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp target
{
bad2: ;
@@ -21,7 +21,7 @@ foo (int x)
{ ok1: break; }
}
- switch (x) /* { dg-error "invalid entry" } */
+ switch (x) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp target
{ case 0:; }
@@ -5,9 +5,9 @@ foo (int x, int y)
{
bad1:
#pragma omp target data map(tofrom: y)
- goto bad1; /* { dg-error "invalid branch" } */
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; /* { dg-error "invalid entry" } */
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp target data map(tofrom: y)
{
bad2: ;
@@ -21,7 +21,7 @@ foo (int x, int y)
{ ok1: break; }
}
- switch (x) /* { dg-error "invalid entry" } */
+ switch (x) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp target data map(tofrom: y)
{ case 0:; }
@@ -5,9 +5,9 @@ foo (int x)
{
bad1:
#pragma omp taskgroup
- goto bad1; /* { dg-error "invalid branch" } */
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; /* { dg-error "invalid entry" } */
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp taskgroup
{
bad2: ;
@@ -21,7 +21,7 @@ foo (int x)
{ ok1: break; }
}
- switch (x) /* { dg-error "invalid entry" } */
+ switch (x) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp taskgroup
{ case 0:; }
@@ -5,9 +5,9 @@ foo (int x)
{
bad1:
#pragma omp target teams
- goto bad1; /* { dg-error "invalid branch" } */
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; /* { dg-error "invalid entry" } */
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp target teams
{
bad2: ;
@@ -21,7 +21,7 @@ foo (int x)
{ ok1: break; }
}
- switch (x) /* { dg-error "invalid entry" } */
+ switch (x) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp target teams
{ case 0:; }
@@ -34,9 +34,9 @@ bar (int x)
bad1:
#pragma omp target
#pragma omp teams
- goto bad1; /* { dg-error "invalid branch" } */
+ goto bad1; // { dg-error "invalid branch to/from OpenMP structured block" }
- goto bad2; /* { dg-error "invalid entry" } */
+ goto bad2; // { dg-error "invalid entry to OpenMP structured block" }
#pragma omp target
#pragma omp teams
{
@@ -52,7 +52,7 @@ bar (int x)
{ ok1: break; }
}
- switch (x) /* { dg-error "invalid entry" } */
+ switch (x) // { dg-error "invalid entry to OpenMP structured block" }
{
#pragma omp target
#pragma omp teams