2015-09-29 Cesar Philippidis <cesar@codesourcery.com>
gcc/
* omp-low.c (check_omp_nesting_restrictions): Update the error
message for loops not affliated with acc compute regions.
gcc/testsuite/
* c-c++-common/goacc-gomp/nesting-fail-1.c (f_omp): Revert changes and
mark the function as an acc routine.
* c-c++-common/goacc/clauses-fail.c: Likewise.
* c-c++-common/goacc/loop-1.c: Likewise.
* c-c++-common/goacc/non-routine.c: Likewise.
* c-c++-common/goacc/sb-1.c: Likewise.
* c-c++-common/goacc/sb-3.c: Likewise.
* gcc.dg/goacc/sb-1.c: Likewise.
* gcc.dg/goacc/sb-3.c: Likewise.
* gfortran.dg/goacc/loop-4.f95: New test.
@@ -2923,8 +2923,8 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
&& get_oacc_fn_attrib (current_function_decl) == NULL)
{
error_at (gimple_location (stmt),
- "acc loops must be associated with an acc region or "
- "routine");
+ "loop directive must be associated with a compute "
+ "region");
return false;
}
/* FALLTHRU */
@@ -358,75 +358,76 @@ f_acc_data (void)
}
}
+#pragma acc routine
void
f_acc_loop (void)
{
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp parallel
+#pragma omp parallel /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp for
+#pragma omp for /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
for (i = 0; i < 3; i++)
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp sections
+#pragma omp sections /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
{
;
}
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp single
+#pragma omp single /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp task
+#pragma omp task /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp master
+#pragma omp master /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp critical
+#pragma omp critical /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp ordered
+#pragma omp ordered /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
}
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop
for (i = 0; i < 2; ++i)
{
-#pragma omp target
+#pragma omp target /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
-#pragma omp target data
+#pragma omp target data /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
;
-#pragma omp target update to(i)
+#pragma omp target update to(i) /* { dg-error "non-OpenACC construct inside of OpenACC region" } */
}
}
@@ -17,4 +17,4 @@ f (void)
;
}
-/* { dg-error "acc loops must be associated with an acc region or routine" "" { target *-*-* } 15 } */
\ No newline at end of file
+/* { dg-error "loop directive must be associated with a compute region" "" { target *-*-* } 15 } */
@@ -36,16 +36,16 @@ int test1()
i = d;
a[i] = 1;
}
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (i = 1; i < 30; i++ )
if (i == 16) break; /* { dg-error "break statement used" } */
/* different types of for loop are allowed */
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (i = 1; i < 10; i++)
{
}
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (i = 1; i < 10; i+=2)
{
a[i] = i;
@@ -8,7 +8,7 @@ main ()
{
int i, v = 0;
-#pragma acc loop gang reduction (+:v) /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop gang reduction (+:v) /* { dg-error "loop directive must be associated with a compute region" } */
for (i = 0; i < 10; i++)
v++;
@@ -11,7 +11,7 @@ void foo()
goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
#pragma acc data
goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (l = 0; l < 2; ++l)
goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
@@ -34,7 +34,7 @@ void foo()
}
goto bad2_loop; // { dg-error "invalid entry to OpenACC structured block" }
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (l = 0; l < 2; ++l)
{
bad2_loop: ;
@@ -64,7 +64,7 @@ void foo()
{ ok1_data: break; }
}
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (l = 0; l < 2; ++l)
{
int i;
@@ -3,7 +3,7 @@
void f (void)
{
int i, j;
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for(i = 1; i < 30; i++)
{
if (i == 7) goto out; // { dg-error "invalid branch to/from OpenACC structured block" }
@@ -9,7 +9,7 @@ void foo()
goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
#pragma acc data
goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (l = 0; l < 2; ++l)
goto bad1; // { dg-error "invalid branch to/from OpenACC structured block" }
@@ -32,7 +32,7 @@ void foo()
}
goto bad2_loop; // { dg-error "invalid entry to OpenACC structured block" }
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (l = 0; l < 2; ++l)
{
bad2_loop: ;
@@ -62,7 +62,7 @@ void foo()
{ ok1_data: break; }
}
- #pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+ #pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for (l = 0; l < 2; ++l)
{
int i;
@@ -1,7 +1,7 @@
void f (void)
{
int i, j;
-#pragma acc loop /* { dg-error "acc loops must be associated with an acc region or routine" } */
+#pragma acc loop /* { dg-error "loop directive must be associated with a compute region" } */
for(i = 1; i < 30; i++)
{
if (i == 7) goto out; // { dg-error "invalid branch to/from OpenACC structured block" }
new file mode 100644
@@ -0,0 +1,7 @@
+! Ensure that loops not affiliated with acc compute regions cause an error.
+
+subroutine test1
+ !$acc loop gang ! { dg-error "loop directive must be associated with a compute region" }
+ DO i = 1,10
+ ENDDO
+end subroutine test1