1  /* { dg-do compile } */
       2  /* { dg-options "-fopenmp" } */
       3  
       4  extern int a;
       5  #pragma omp declare target
       6  #pragma omp declare target to (a)
       7  #pragma omp end declare target
       8  int b;
       9  #pragma omp declare target to (b) link (b)	/* { dg-error "appears more than once on the same .declare target. directive" } */
      10  #pragma omp declare target enter (b) link (b)	/* { dg-error "appears more than once on the same .declare target. directive" } */
      11  int c;
      12  #pragma omp declare target (c)
      13  #pragma omp declare target link (c)		/* { dg-error "specified both in declare target 'link' and 'to' or 'enter' clauses" } */
      14  int c2;
      15  #pragma omp declare target to (c2)
      16  #pragma omp declare target link (c2)		/* { dg-error "specified both in declare target 'link' and 'to' or 'enter' clauses" } */
      17  int c3;
      18  #pragma omp declare target enter (c3)
      19  #pragma omp declare target link (c3)		/* { dg-error "specified both in declare target 'link' and 'to' or 'enter' clauses" } */
      20  int c4;
      21  #pragma omp declare target link (c4)
      22  #pragma omp declare target (c4)			/* { dg-error "specified both in declare target 'link' and 'enter' clauses" } */
      23  int c5;
      24  #pragma omp declare target link (c5)
      25  #pragma omp declare target to (c5)		/* { dg-error "specified both in declare target 'link' and 'to' clauses" } */
      26  int c6;
      27  #pragma omp declare target link (c6)
      28  #pragma omp declare target enter (c6)		/* { dg-error "specified both in declare target 'link' and 'enter' clauses" } */
      29  int foo (void);
      30  #pragma omp declare target link (foo)		/* { dg-error "is not a variable in clause" } */
      31  struct S;
      32  extern struct S d[];				/* { dg-error "array type has incomplete element type" "" { target c } } */
      33  #pragma omp declare target to (d)		/* { dg-error "does not have a mappable type in" } */
      34  extern struct S e;
      35  #pragma omp declare target link (e)		/* { dg-error "does not have a mappable type in" } */
      36  extern int f[];
      37  #pragma omp declare target to (f)		/* { dg-error "does not have a mappable type in" } */
      38  int g, h;
      39  #pragma omp threadprivate (g, h)
      40  #pragma omp declare target to (g)		/* { dg-error "is threadprivate variable in" } */
      41  #pragma omp declare target link (h)		/* { dg-error "is threadprivate variable in" } */
      42  int j[10];
      43  #pragma omp declare target to (j[0:4])		/* { dg-error "expected" } */
      44  int k, l;
      45  #pragma omp declare target
      46  int m;
      47  #pragma omp end declare target
      48  #pragma omp declare target to (k)
      49  #pragma omp declare target (k)
      50  #pragma omp declare target to (k, m) link (l)
      51  #pragma omp declare target enter (k, m) link (l)
      52  #pragma omp declare target link (l)
      53  int n, o, s, t;
      54  #pragma omp declare target to (n) to (n)	/* { dg-error "appears more than once on the same .declare target. directive" } */
      55  #pragma omp declare target enter (n) enter (n)	/* { dg-error "appears more than once on the same .declare target. directive" } */
      56  #pragma omp declare target enter (n) to (n)	/* { dg-error "appears more than once on the same .declare target. directive" } */
      57  #pragma omp declare target to (n) enter (n)	/* { dg-error "appears more than once on the same .declare target. directive" } */
      58  #pragma omp declare target link (o, o)		/* { dg-error "appears more than once on the same .declare target. directive" } */
      59  #pragma omp declare target (s, t, s)		/* { dg-error "appears more than once on the same .declare target. directive" } */
      60  int p, q, r;
      61  #pragma omp declare target (p) to (q)		/* { dg-error "expected end of line before .to." } */
      62  #pragma omp declare target to (p) (q) link (r)	/* { dg-error "expected .#pragma omp. clause before" } */
      63  #pragma omp declare target link (r) (p)		/* { dg-error "expected .#pragma omp. clause before" } */
      64  #pragma omp declare target
      65  #pragma omp end declare target to (p)		/* { dg-error "expected end of line before .to." } */