view gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-1.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

/* Test various aspects of clauses specifying incompatible levels of
   parallelism with the OpenACC 'routine' directive.  */

extern void g_1 (void);
#pragma acc routine (g_1) gang gang /* { dg-error "too many 'gang' clauses" } */

#pragma acc routine worker worker /* { dg-error "too many 'worker' clauses" } */
void w_1 (void)
{
}

#pragma acc routine vector vector /* { dg-error "too many 'vector' clauses" } */
void v_1 (void)
{
}

#pragma acc routine seq seq /* { dg-error "too many 'seq' clauses" } */
extern void s_1 (void);


#pragma acc routine gang gang gang /* { dg-error "too many 'gang' clauses" } */
void g_2 (void)
{
}

#pragma acc routine worker worker worker /* { dg-error "too many 'worker' clauses" } */
extern void w_2 (void);

extern void v_2 (void);
#pragma acc routine (v_2) vector vector vector /* { dg-error "too many 'vector' clauses" } */

#pragma acc routine seq seq seq /* { dg-error "too many 'seq' clauses" } */
void s_2 (void)
{
}


#pragma acc routine \
  gang \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */
void g_3 (void)
{
}
#pragma acc routine (g_3) \
  gang \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
#pragma acc routine (g_3) \
  gang \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */

extern void w_3 (void);
#pragma acc routine (w_3) \
  worker \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */
#pragma acc routine (w_3) \
  worker \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
#pragma acc routine (w_3) \
  worker \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */

#pragma acc routine \
  vector \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
void v_3 (void)
{
}
#pragma acc routine (v_3) \
  vector \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */
#pragma acc routine (v_3) \
  vector \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */

extern void s_3 (void);
#pragma acc routine (s_3) \
  seq \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
#pragma acc routine (s_3) \
  seq \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */
#pragma acc routine (s_3) \
  seq \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */


#pragma acc routine \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
extern void g_4 (void);
#pragma acc routine (g_4) \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
#pragma acc routine (g_4) \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */

extern void w_4 (void);
#pragma acc routine (w_4) \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
#pragma acc routine (w_4) \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
#pragma acc routine (w_4) \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */

#pragma acc routine \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
void v_4 (void)
{
}
#pragma acc routine (v_4) \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
#pragma acc routine (v_4) \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */ \
  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */

#pragma acc routine \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
void s_4 (void)
{
}
#pragma acc routine (s_4) \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */
#pragma acc routine (s_4) \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" } */ \
  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" } */ \
  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */


#pragma acc routine \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
void g_5 (void)
{
}
#pragma acc routine (g_5) \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (g_5) \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */

#pragma acc routine \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
extern void w_5 (void);
#pragma acc routine (w_5) \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (w_5) \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */

#pragma acc routine \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
extern void v_5 (void);
#pragma acc routine (v_5) \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (v_5) \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */

extern void s_5 (void);
#pragma acc routine (s_5) \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (s_5) \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (s_5) \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */


/* Like the *_5 tests, but with the order of clauses changed in the second and
   following routine directives for the specific *_5 function.  */

#pragma acc routine \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
void g_6 (void)
{
}
#pragma acc routine (g_6) \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*g_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (g_6) \
  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*g_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */

#pragma acc routine \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
extern void w_6 (void);
#pragma acc routine (w_6) \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*w_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (w_6) \
  seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*w_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */

#pragma acc routine \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
extern void v_6 (void);
#pragma acc routine (v_6) \
  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*v_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (v_6) \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error "incompatible .gang. clause when applying .#pragma acc routine. to .\[void \]*v_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */

extern void s_6 (void);
#pragma acc routine (s_6) \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (s_6) \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*s_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */
#pragma acc routine (s_6) \
  worker worker /* { dg-error "too many 'worker' clauses" } */ \
  /* { dg-error "incompatible .worker. clause when applying .#pragma acc routine. to .\[void \]*s_6\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" "" { target *-*-* } .-1 } */ \
  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */ \
  gang gang /* { dg-error "too many 'gang' clauses" } */ \
  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { target *-*-* } .-1 } */


/* Like the *_6 tests, but without all the duplicate clauses, so that the
   routine directives are valid in isolation.  */

#pragma acc routine \
  gang
void g_7 (void)
{
}
#pragma acc routine (g_7) \
  vector /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*g_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */
#pragma acc routine (g_7) \
  seq /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*g_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */

#pragma acc routine \
  worker
extern void w_7 (void);
#pragma acc routine (w_7) \
  vector /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*w_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */
#pragma acc routine (w_7) \
  seq /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*w_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */

#pragma acc routine \
  vector
extern void v_7 (void);
#pragma acc routine (v_7) \
  seq /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*v_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */
#pragma acc routine (v_7) \
  gang /* { dg-error "incompatible .gang. clause when applying .#pragma acc routine. to .\[void \]*v_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */

extern void s_7 (void);
#pragma acc routine (s_7) \
  seq
#pragma acc routine (s_7) \
  vector /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*s_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */
#pragma acc routine (s_7) \
  worker /* { dg-error "incompatible .worker. clause when applying .#pragma acc routine. to .\[void \]*s_7\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */


/* Test cases for implicit seq clause.  */

#pragma acc routine \
  gang
void g_8 (void)
{
}
#pragma acc routine (g_8) /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*g_8\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */

#pragma acc routine \
  worker
extern void w_8 (void);
#pragma acc routine (w_8) /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*w_8\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */

#pragma acc routine \
  vector
extern void v_8 (void);
#pragma acc routine (v_8) /* { dg-error "incompatible .seq. clause when applying .#pragma acc routine. to .\[void \]*v_8\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */

extern void s_8 (void);
#pragma acc routine (s_8)
#pragma acc routine (s_8) \
  vector /* { dg-error "incompatible .vector. clause when applying .#pragma acc routine. to .\[void \]*s_8\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */
#pragma acc routine (s_8) \
  gang /* { dg-error "incompatible .gang. clause when applying .#pragma acc routine. to .\[void \]*s_8\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */
#pragma acc routine (s_8) \
  worker /* { dg-error "incompatible .worker. clause when applying .#pragma acc routine. to .\[void \]*s_8\[\\(\\)\]*., which has already been marked with an OpenACC 'routine' directive" } */