2015-05-15 Cesar Philippidis <cesar@codesourcery.com>
gcc/c/
* c-parser.c (typedef struct c_parser): Add BOOL_BITFIELDS
oacc_parallel_region and oacc_kernels_region.
(c_parser_oacc_shape_clause): Only use op1 for the static argument
in the gang clause. Check for incompatible clause arguments inside
parallel regions.
(c_parser_oacc_loop): Error on conflicting loop clauses.
(c_parser_oacc_kernels): Error in nested parallel and kernels.
(c_parser_oacc_parallel): Likewise.
gcc/cp/
* parser.h (typedef struct cp_parser): Add bool oacc_parallel_region
and oacc_kernels_region.
* parser.c (cp_parser_oacc_shape_clause): Only use op1 for the static
argument in the gang clause. Check for incompatible clause arguments
inside parallel regions.
(cp_parser_oacc_loop): Error on conflicting loop clauses.
(cp_parser_oacc_parallel_kernels): Error in nested parallel and
kernels.
gcc/
* omp-low.c (scan_omp_for): Remove check for nested parallel and
kernels regions.
gcc/testsuite/
* c-c++-common/goacc/nesting-fail-1.c: Update error messages.
* g++.dg/goacc/loop-4.C: New test.
* gcc.dg/goacc/loop-1.c: New test.
@@ -234,6 +234,10 @@ typedef struct GTY(()) c_parser {
/* True if we are in a context where the Objective-C "Property attribute"
keywords are valid. */
BOOL_BITFIELD objc_property_attr_context : 1;
+ /* True if we are inside a OpenACC parallel region. */
+ BOOL_BITFIELD oacc_parallel_region : 1;
+ /* True if we are inside a OpenACC kernels region. */
+ BOOL_BITFIELD oacc_kernels_region : 1;
/* Cilk Plus specific parser/lexer information. */
@@ -10839,6 +10843,7 @@ c_parser_oacc_shape_clause (c_parser *parser, pragma_omp_clause c_kind,
mark_exp_read (expr);
require_positive_expr (expr, expr_loc, str);
*op_to_parse = expr;
+ op_to_parse = &op0;
}
while (!c_parser_next_token_is (parser, CPP_CLOSE_PAREN));
c_parser_consume_token (parser);
@@ -10852,6 +10857,17 @@ c_parser_oacc_shape_clause (c_parser *parser, pragma_omp_clause c_kind,
if (op1)
OMP_CLAUSE_OPERAND (c, 1) = op1;
OMP_CLAUSE_CHAIN (c) = list;
+
+ if (parser->oacc_parallel_region && (op0 != NULL || op1 != NULL))
+ {
+ if (c_kind != PRAGMA_OACC_CLAUSE_GANG)
+ c_parser_error (parser, c_kind == PRAGMA_OACC_CLAUSE_WORKER ?
+ "worker clause arguments are not supported in OpenACC parallel regions"
+ : "vector clause arguments are not supported in OpenACC parallel regions");
+ else if (op0 != NULL)
+ c_parser_error (parser, "non-static argument to clause gang");
+ }
+
return c;
}
@@ -12721,7 +12737,10 @@ static tree
c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name,
omp_clause_mask mask, tree *cclauses)
{
- tree stmt, clauses, block;
+ tree stmt, clauses, block, c;
+ bool gwv = false;
+ bool auto_clause = false;
+ bool seq_clause = false;
strcat (p_name, " loop");
mask |= OACC_LOOP_CLAUSE_MASK;
@@ -12732,6 +12751,33 @@ c_parser_oacc_loop (location_t loc, c_parser *parser, char *p_name,
if (cclauses)
clauses = oacc_split_loop_clauses (clauses, cclauses);
+ for (c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
+ {
+ switch (OMP_CLAUSE_CODE (c))
+ {
+ case OMP_CLAUSE_GANG:
+ case OMP_CLAUSE_WORKER:
+ case OMP_CLAUSE_VECTOR:
+ gwv = true;
+ break;
+ case OMP_CLAUSE_AUTO:
+ auto_clause = true;
+ break;
+ case OMP_CLAUSE_SEQ:
+ seq_clause = true;
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (gwv && auto_clause)
+ c_parser_error (parser, "incompatible use of clause %<auto%>");
+ else if (gwv && seq_clause)
+ c_parser_error (parser, "incompatible use of clause %<seq%>");
+ else if (auto_clause && seq_clause)
+ c_parser_error (parser, "incompatible use of clause %<seq%> and %<auto%>");
+
block = c_begin_compound_stmt (true);
stmt = c_parser_omp_for_loop (loc, parser, OACC_LOOP, clauses, NULL);
block = c_end_compound_stmt (loc, block, true);
@@ -12774,6 +12820,13 @@ c_parser_oacc_kernels (location_t loc, c_parser *parser, char *p_name)
strcat (p_name, " kernels");
+ if (parser->oacc_parallel_region || parser->oacc_kernels_region)
+ {
+ c_parser_error (parser, "nested kernels region");
+ }
+
+ parser->oacc_kernels_region = true;
+
mask = OACC_KERNELS_CLAUSE_MASK;
if (c_parser_next_token_is (parser, CPP_NAME))
{
@@ -12787,6 +12840,7 @@ c_parser_oacc_kernels (location_t loc, c_parser *parser, char *p_name)
block = c_begin_omp_parallel ();
c_parser_oacc_loop (loc, parser, p_name, mask, &kernel_clauses);
stmt = c_finish_oacc_kernels (loc, kernel_clauses, block);
+ parser->oacc_kernels_region = false;
return stmt;
}
}
@@ -12797,6 +12851,7 @@ c_parser_oacc_kernels (location_t loc, c_parser *parser, char *p_name)
block = c_begin_omp_parallel ();
add_stmt (c_parser_omp_structured_block (parser));
stmt = c_finish_oacc_kernels (loc, clauses, block);
+ parser->oacc_kernels_region = false;
return stmt;
}
@@ -12843,6 +12898,13 @@ c_parser_oacc_parallel (location_t loc, c_parser *parser, char *p_name)
strcat (p_name, " parallel");
+ if (parser->oacc_parallel_region || parser->oacc_kernels_region)
+ {
+ c_parser_error (parser, "nested parallel region");
+ }
+
+ parser->oacc_parallel_region = true;
+
mask = OACC_PARALLEL_CLAUSE_MASK;
dmask = OACC_PARALLEL_CLAUSE_DEVICE_TYPE_MASK;
if (c_parser_next_token_is (parser, CPP_NAME))
@@ -12857,6 +12919,7 @@ c_parser_oacc_parallel (location_t loc, c_parser *parser, char *p_name)
block = c_begin_omp_parallel ();
c_parser_oacc_loop (loc, parser, p_name, mask, ¶llel_clauses);
stmt = c_finish_oacc_parallel (loc, parallel_clauses, block);
+ parser->oacc_parallel_region = false;
return stmt;
}
}
@@ -12866,6 +12929,7 @@ c_parser_oacc_parallel (location_t loc, c_parser *parser, char *p_name)
block = c_begin_omp_parallel ();
add_stmt (c_parser_omp_structured_block (parser));
stmt = c_finish_oacc_parallel (loc, clauses, block);
+ parser->oacc_parallel_region = false;
return stmt;
}
@@ -28318,6 +28318,7 @@ cp_parser_oacc_shape_clause (cp_parser *parser, pragma_omp_clause c_kind,
mark_exp_read (expr);
require_positive_expr (expr, expr_loc, str);
*op_to_parse = expr;
+ op_to_parse = &op0;
if (cp_lexer_next_token_is (lexer, CPP_COMMA))
cp_lexer_consume_token (lexer);
@@ -28334,6 +28335,17 @@ cp_parser_oacc_shape_clause (cp_parser *parser, pragma_omp_clause c_kind,
if (op1)
OMP_CLAUSE_OPERAND (c, 1) = op1;
OMP_CLAUSE_CHAIN (c) = list;
+
+ if (parser->oacc_parallel_region && (op0 != NULL || op1 != NULL))
+ {
+ if (c_kind != PRAGMA_OACC_CLAUSE_GANG)
+ cp_parser_error (parser, c_kind == PRAGMA_OACC_CLAUSE_WORKER ?
+ "worker clause arguments are not supported in OpenACC parallel regions"
+ : "vector clause arguments are not supported in OpenACC parallel regions");
+ else if (op0 != NULL)
+ cp_parser_error (parser, "non-static argument to clause gang");
+ }
+
return c;
}
@@ -32198,7 +32210,10 @@ static tree
cp_parser_oacc_loop (cp_parser *parser, cp_token *pragma_tok, char *p_name,
omp_clause_mask mask, tree *cclauses)
{
- tree stmt, clauses, block;
+ tree stmt, clauses, block, c;
+ bool gwv = false;
+ bool auto_clause = false;
+ bool seq_clause = false;
int save;
strcat (p_name, " loop");
@@ -32211,6 +32226,33 @@ cp_parser_oacc_loop (cp_parser *parser, cp_token *pragma_tok, char *p_name,
if (cclauses)
clauses = oacc_split_loop_clauses (clauses, cclauses);
+ for (c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
+ {
+ switch (OMP_CLAUSE_CODE (c))
+ {
+ case OMP_CLAUSE_GANG:
+ case OMP_CLAUSE_WORKER:
+ case OMP_CLAUSE_VECTOR:
+ gwv = true;
+ break;
+ case OMP_CLAUSE_AUTO:
+ auto_clause = true;
+ break;
+ case OMP_CLAUSE_SEQ:
+ seq_clause = true;
+ break;
+ default:
+ ;
+ }
+ }
+
+ if (gwv && auto_clause)
+ cp_parser_error (parser, "incompatible use of clause %<auto%>");
+ else if (gwv && seq_clause)
+ cp_parser_error (parser, "incompatible use of clause %<seq%>");
+ else if (auto_clause && seq_clause)
+ cp_parser_error (parser, "incompatible use of clause %<seq%> and %<auto%>");
+
block = begin_omp_structured_block ();
save = cp_parser_begin_omp_structured_block (parser);
stmt = cp_parser_omp_for_loop (parser, OACC_LOOP, clauses, NULL);
@@ -32288,13 +32330,21 @@ cp_parser_oacc_parallel_kernels (cp_parser *parser, cp_token *pragma_tok,
cp_lexer *lexer = parser->lexer;
omp_clause_mask mask, dtype_mask;
+ if (parser->oacc_parallel_region || parser->oacc_kernels_region)
+ {
+ cp_parser_error (parser, is_parallel ? "nested parallel region"
+ : "nested kernels region");
+ }
+
if (is_parallel)
{
+ parser->oacc_parallel_region = true;
mask = OACC_PARALLEL_CLAUSE_MASK;
strcat (p_name, " parallel");
}
else
{
+ parser->oacc_kernels_region = true;
mask = OACC_KERNELS_CLAUSE_MASK;
strcat (p_name, " kernels");
}
@@ -32313,6 +32363,10 @@ cp_parser_oacc_parallel_kernels (cp_parser *parser, cp_token *pragma_tok,
&combined_clauses);
stmt = is_parallel ? finish_oacc_parallel (combined_clauses, block)
: finish_oacc_kernels (combined_clauses, block);
+ if (is_parallel)
+ parser->oacc_parallel_region = false;
+ else
+ parser->oacc_kernels_region = false;
return stmt;
}
}
@@ -32329,6 +32383,10 @@ cp_parser_oacc_parallel_kernels (cp_parser *parser, cp_token *pragma_tok,
cp_parser_end_omp_structured_block (parser, save);
stmt = is_parallel ? finish_oacc_parallel (clauses, block)
: finish_oacc_kernels (clauses, block);
+ if (is_parallel)
+ parser->oacc_parallel_region = false;
+ else
+ parser->oacc_kernels_region = false;
return stmt;
}
@@ -377,6 +377,11 @@ typedef struct GTY(()) cp_parser {
cp_omp_declare_simd_data * GTY((skip)) oacc_routine;
vec <tree, va_gc> *named_oacc_routines;
+ /* True if we are inside a OpenACC parallel region. */
+ bool oacc_parallel_region;
+ /* True if we are inside a OpenACC kernels region. */
+ bool oacc_kernels_region;
+
/* Nonzero if parsing a parameter list where 'auto' should trigger an implicit
template parameter. */
bool auto_is_implicit_function_template_parm_p;
@@ -2959,14 +2959,6 @@ scan_omp_for (gomp_for *stmt, omp_context *outer_ctx)
}
if (outer_type == GIMPLE_OMP_FOR)
outer_ctx->gwv_below |= val;
- if (OMP_CLAUSE_OPERAND (c, 0) != NULL_TREE)
- {
- omp_context *enclosing = enclosing_target_ctx (outer_ctx);
- if (gimple_omp_target_kind (enclosing->stmt)
- == GF_OMP_TARGET_KIND_OACC_PARALLEL)
- error_at (gimple_location (stmt),
- "no arguments allowed to gang, worker and vector clauses inside parallel");
- }
}
}
@@ -7,9 +7,9 @@ f_acc_parallel (void)
{
#pragma acc parallel
{
-#pragma acc parallel /* { dg-bogus "parallel construct inside of parallel region" "not implemented" { xfail *-*-* } } */
+#pragma acc parallel /* { dg-error "nested parallel region" } */
;
-#pragma acc kernels /* { dg-bogus "kernels construct inside of parallel region" "not implemented" { xfail *-*-* } } */
+#pragma acc kernels /* { dg-error " kernels construct inside of parallel" } */
;
#pragma acc data /* { dg-error "data construct inside of parallel region" } */
;
@@ -26,9 +26,9 @@ f_acc_kernels (void)
{
#pragma acc kernels
{
-#pragma acc parallel /* { dg-bogus "parallel construct inside of kernels region" "not implemented" { xfail *-*-* } } */
+#pragma acc parallel /* { dg-error "nested parallel region" } */
;
-#pragma acc kernels /* { dg-bogus "kernels construct inside of kernels region" "not implemented" { xfail *-*-* } } */
+#pragma acc kernels /* { dg-error "nested kernels region" } */
;
#pragma acc data /* { dg-error "data construct inside of kernels region" } */
;
@@ -37,3 +37,8 @@ f_acc_kernels (void)
#pragma acc exit data delete(i) /* { dg-error "enter/exit data construct inside of kernels region" } */
}
}
+
+// { dg-error "parallel construct inside of parallel" "" { target *-*-* } 10 }
+
+// { dg-error "parallel construct inside of kernels" "" { target *-*-* } 29 }
+// { dg-error "kernels construct inside of kernels" "" { target *-*-* } 31 }
new file mode 100644
@@ -0,0 +1,686 @@
+// { dg-do compile }
+// { dg-options "-fopenacc" }
+// { dg-additional-options "-fmax-errors=200" }
+
+int
+main ()
+{
+ int i, j;
+
+#pragma acc kernels
+ {
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 0; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 0; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(length:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile() // { dg-error "expected primary-expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(2)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(6-2)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(6+2)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(*, 1)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; i++)
+ { }
+ }
+#pragma acc loop tile(-1) // { dg-error "tile argument needs positive constant integer" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(i) // { dg-error "tile argument needs positive constant integer" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(2, 2, 1)
+ for (i = 2; i < 4; i++)
+ for (i = 4; i < 6; i++)
+ { }
+#pragma acc loop tile(2, 2)
+ for (i = 1; i < 5; i+=2)
+ for (j = i+1; j < 7; i++)
+ { }
+#pragma acc loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+ }
+
+
+#pragma acc parallel
+ {
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(5) // { dg-error "non-static" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(num:5) // { dg-error "non-static" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(5) // { dg-error "worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(num:5) // { dg-error "worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(length:5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile() // { dg-error "expected primary-expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(2)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop tile(-1) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc loop tile(i) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc loop tile(2, 2, 1)
+ for (i = 1; i < 3; i++)
+ {
+ for (j = 4; j < 6; j++)
+ { }
+ }
+#pragma acc loop tile(2, 2)
+ for (i = 1; i < 5; i+=2)
+ {
+ for (j = i + 1; j < 7; j+=i)
+ { }
+ }
+#pragma acc loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+ }
+
+#pragma acc kernels loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc kernels loop gang // { dg-error "nested kernels region" }
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc kernels loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc kernels loop worker // { dg-error "nested kernels region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc kernels loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc kernels loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector(length:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc kernels loop vector // { dg-error "nested kernels region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc kernels loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc kernels loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc kernels loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc kernels loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile() // { dg-error "expected primary-expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(*, 1)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop tile(-1) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(i) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(2, 2, 1)
+ for (i = 1; i < 3; i++)
+ {
+ for (j = 4; j < 6; j++)
+ { }
+ }
+#pragma acc kernels loop tile(2, 2)
+ for (i = 1; i < 5; i++)
+ {
+ for (j = i + 1; j < 7; j += i)
+ { }
+ }
+#pragma acc kernels loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc parallel loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(5) // { dg-error "non-static argument to clause gang" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(num:5) // { dg-error "non-static argument to clause gang" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc parallel loop gang // { dg-error "nested parallel region" }
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc parallel loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker(5) // { dg-error " worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker(num:5) // { dg-error " worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc parallel loop worker // { dg-error "nested parallel region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc parallel loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc parallel loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector(5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector(length:5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc parallel loop vector // { dg-error "nested parallel region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc parallel loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc parallel loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc parallel loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc parallel loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile() // { dg-error "expected primary-expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(*, 1)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop tile(-1) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(i) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(2, 2, 1)
+ for (i = 1; i < 3; i++)
+ {
+ for (j = 4; j < 6; j++)
+ { }
+ }
+#pragma acc parallel loop tile(2, 2)
+ for (i = 1; i < 5; i+=2)
+ {
+ for (j = i + 1; j < 7; j++)
+ { }
+ }
+#pragma acc parallel loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+
+ return 0;
+}
+
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 377 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 397 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 400 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 423 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 426 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 429 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 535 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 555 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 558 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 581 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 584 }
+// { dg-error "OpenACC construct inside of non-OpenACC region" "" { target *-*-* } 587 }
new file mode 100644
@@ -0,0 +1,674 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fmax-errors=200" } */
+
+int
+main ()
+{
+ int i, j;
+
+#pragma acc kernels
+ {
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 0; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 0; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 0; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(length:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile() // { dg-error "expected expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(2)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(6-2)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(6+2)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(*, 1)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 0; j < 10; i++)
+ { }
+ }
+#pragma acc loop tile(-1) // { dg-error "tile argument needs positive constant integer" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(i) // { dg-error "tile argument needs positive constant integer" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(2, 2, 1)
+ for (i = 2; i < 4; i++)
+ for (i = 4; i < 6; i++)
+ { }
+#pragma acc loop tile(2, 2)
+ for (i = 1; i < 5; i+=2)
+ for (j = i+1; j < 7; i++)
+ { }
+#pragma acc loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+ }
+
+
+#pragma acc parallel
+ {
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(5) // { dg-error "non-static" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(num:5) // { dg-error "non-static" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(5) // { dg-error "worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker(num:5) // { dg-error "worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector(length:5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector // { dg-error "gang, worker and vector may occur only once in a loop nest" }
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc loop vector
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile() // { dg-error "expected expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop tile(2)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc loop tile(-1) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc loop tile(i) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc loop tile(2, 2, 1)
+ for (i = 1; i < 3; i++)
+ {
+ for (j = 4; j < 6; j++)
+ { }
+ }
+#pragma acc loop tile(2, 2)
+ for (i = 1; i < 5; i+=2)
+ {
+ for (j = i + 1; j < 7; j+=i)
+ { }
+ }
+#pragma acc loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+ }
+
+#pragma acc kernels loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc kernels loop gang // { dg-error "nested kernels region" }
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc kernels loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker(num:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc kernels loop worker // { dg-error "nested kernels region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc kernels loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc kernels loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector(5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector(length:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc kernels loop vector // { dg-error "nested kernels region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc kernels loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc kernels loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc kernels loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc kernels loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc kernels loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile() // { dg-error "expected expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(*, 1)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc kernels loop tile(-1) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(i) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc kernels loop tile(2, 2, 1)
+ for (i = 1; i < 3; i++)
+ {
+ for (j = 4; j < 6; j++)
+ { }
+ }
+#pragma acc kernels loop tile(2, 2)
+ for (i = 1; i < 5; i++)
+ {
+ for (j = i + 1; j < 7; j += i)
+ { }
+ }
+#pragma acc kernels loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc kernels loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc parallel loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(5) // { dg-error "non-static argument to clause gang" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(num:5) // { dg-error "non-static argument to clause gang" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(static:5)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang(static:*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc parallel loop gang // { dg-error "nested parallel region" }
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop seq gang
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc parallel loop worker
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker(5) // { dg-error " worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker(num:5) // { dg-error " worker clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc parallel loop worker // { dg-error "nested parallel region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc parallel loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop seq worker
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop gang worker
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc parallel loop vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector(5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector(length:5) // { dg-error "vector clause arguments are not supported" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector
+ for (i = 0; i < 10; i++)
+ {
+#pragma acc parallel loop vector // { dg-error "nested parallel region" }
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc parallel loop worker
+ for (j = 1; j < 10; j++)
+ { }
+#pragma acc parallel loop gang
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop seq vector
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop gang vector
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker vector
+ for (i = 0; i < 10; i++)
+ { }
+
+#pragma acc parallel loop auto
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop seq auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop gang auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop worker auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+#pragma acc parallel loop vector auto
+ for (i = 0; i < 10; i++) // { dg-error "incompatible use of clause" }
+ { }
+
+#pragma acc parallel loop tile // { dg-error "expected" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile() // { dg-error "expected expression" }
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(1)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(*, 1)
+ for (i = 0; i < 10; i++)
+ {
+ for (j = 1; j < 10; j++)
+ { }
+ }
+#pragma acc parallel loop tile(-1) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(i) // { dg-error "tile argument needs positive constant integer expression" }
+ for (i = 1; i < 10; i++)
+ { }
+#pragma acc parallel loop tile(2, 2, 1)
+ for (i = 1; i < 3; i++)
+ {
+ for (j = 4; j < 6; j++)
+ { }
+ }
+#pragma acc parallel loop tile(2, 2)
+ for (i = 1; i < 5; i+=2)
+ {
+ for (j = i + 1; j < 7; j++)
+ { }
+ }
+#pragma acc parallel loop vector tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector gang tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop vector worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+#pragma acc parallel loop gang worker tile(*)
+ for (i = 0; i < 10; i++)
+ { }
+
+ return 0;
+}
+
+// { dg-excess-errors "invalid controlling predicate" }