1  /* Test invalid use of the OpenACC 'declare' directive.  */
       2  
       3  
       4  #pragma acc declare /* { dg-error "no valid clauses" } */
       5  
       6  #pragma acc declare create(undeclared) /* { dg-error "undeclared" } */
       7  /* { dg-error "no valid clauses" "second error" { target *-*-* } .-1 } */
       8  
       9  int v0[10];
      10  #pragma acc declare create(v0[1:3]) /* { dg-error "array section" } */
      11  
      12  int v1;
      13  #pragma acc declare create(v1, v1) /* { dg-error "more than once" } */
      14  
      15  int v2;
      16  #pragma acc declare create(v2)
      17  #pragma acc declare copyin(v2) /* { dg-error "more than once" } */
      18  
      19  int v3;
      20  #pragma acc declare copy(v3) /* { dg-error "at file scope" } */
      21  
      22  int v4;
      23  #pragma acc declare copyout(v4) /* { dg-error "at file scope" } */
      24  
      25  int v5;
      26  #pragma acc declare present(v5) /* { dg-error "at file scope" } */
      27  
      28  int v6;
      29  #pragma acc declare present_or_copy(v6) /* { dg-error "at file scope" } */
      30  
      31  int v7;
      32  #pragma acc declare present_or_copyout(v7) /* { dg-error "at file scope" } */
      33  
      34  int va10;
      35  #pragma acc declare create (va10)
      36  #pragma acc declare link (va10) /* { dg-error "more than once" } */
      37  
      38  int va11;
      39  #pragma acc declare link (va11)
      40  #pragma acc declare link (va11) /* { dg-error "more than once" } */
      41  
      42  int va12;
      43  #pragma acc declare create (va12) link (va12) /* { dg-error "more than once" } */
      44  
      45  
      46  void
      47  f (void)
      48  {
      49    int va0;
      50  #pragma acc declare link(va0) /* { dg-error "global variable" } */
      51  
      52    extern int ve0;
      53  #pragma acc declare copy(ve0) /* { dg-error "invalid use of" } */
      54  
      55    extern int ve1;
      56  #pragma acc declare copyout(ve1) /* { dg-error "invalid use of" } */
      57  
      58    extern int ve2;
      59  #pragma acc declare present(ve2) /* { dg-error "invalid use of" } */
      60  
      61    extern int ve3;
      62  #pragma acc declare present_or_copy(ve3) /* { dg-error "invalid use of" } */
      63  
      64    extern int ve4;
      65  #pragma acc declare present_or_copyout(ve4) /* { dg-error "invalid use of" } */
      66  
      67  #pragma acc declare present (v2) /* { dg-error "invalid use of" } */
      68  }
      69  
      70  
      71  /* The same as 'f' but everything contained in an OpenACC 'data' construct.  */
      72  
      73  void
      74  f_data (void)
      75  {
      76  #pragma acc data
      77    {
      78      int va0;
      79  # pragma acc declare link(va0) /* { dg-error "global variable" } */
      80  
      81      extern int ve0;
      82  # pragma acc declare copy(ve0) /* { dg-error "invalid use of" } */
      83  
      84      extern int ve1;
      85  # pragma acc declare copyout(ve1) /* { dg-error "invalid use of" } */
      86  
      87      extern int ve2;
      88  # pragma acc declare present(ve2) /* { dg-error "invalid use of" } */
      89  
      90      extern int ve3;
      91  # pragma acc declare present_or_copy(ve3) /* { dg-error "invalid use of" } */
      92  
      93      extern int ve4;
      94  # pragma acc declare present_or_copyout(ve4) /* { dg-error "invalid use of" } */
      95  
      96  # pragma acc declare present (v2) /* { dg-error "invalid use of" } */
      97    }
      98  }
      99  
     100  
     101  /* Testing for PR90868 "Duplicate OpenACC 'declare' directives for 'extern'
     102     variables".  */
     103  
     104  
     105  void
     106  f_pr90868 (void)
     107  {
     108    extern int we0;
     109  #pragma acc declare create(we0)
     110  
     111    extern int we1;
     112  #pragma acc declare copyin(we1)
     113  
     114    extern int *we2;
     115  #pragma acc declare deviceptr(we2)
     116  
     117    extern int we3;
     118  #pragma acc declare device_resident(we3)
     119  
     120    extern int we4;
     121  #pragma acc declare link(we4)
     122  
     123    extern int we5;
     124  #pragma acc declare present_or_copyin(we5)
     125   
     126    extern int we6;
     127  #pragma acc declare present_or_create(we6)
     128  }
     129  
     130  
     131  /* The same as 'f_pr90868'.  */
     132  
     133  /* The errors are emitted for C only; for C++, the duplicate OpenACC 'declare'
     134     directives for 'extern' variables are accepted.  */
     135  
     136  void
     137  f_pr90868_2 (void)
     138  {
     139    extern int we0;
     140  #pragma acc declare create(we0) /* { dg-error "variable 'we0' used more than once with '#pragma acc declare'" "" { target c } } */
     141  
     142    extern int we1;
     143  #pragma acc declare copyin(we1) /* { dg-error "variable 'we1' used more than once with '#pragma acc declare'" "" { target c } } */
     144  
     145    extern int *we2;
     146  #pragma acc declare deviceptr(we2) /* { dg-error "variable 'we2' used more than once with '#pragma acc declare'" "" { target c } } */
     147  
     148    extern int we3;
     149  #pragma acc declare device_resident(we3) /* { dg-error "variable 'we3' used more than once with '#pragma acc declare'" "" { target c } } */
     150  
     151    extern int we4;
     152  #pragma acc declare link(we4) /* { dg-error "variable 'we4' used more than once with '#pragma acc declare'" "" { target c } } */
     153  
     154    extern int we5;
     155  #pragma acc declare present_or_copyin(we5) /* { dg-error "variable 'we5' used more than once with '#pragma acc declare'" "" { target c } } */
     156   
     157    extern int we6;
     158  #pragma acc declare present_or_create(we6) /* { dg-error "variable 'we6' used more than once with '#pragma acc declare'" "" { target c } } */
     159  }
     160  
     161  
     162  /* The same as 'f_pr90868' but everything contained in an OpenACC 'data'
     163     construct.  */
     164  
     165  #ifdef __cplusplus
     166  /* TODO PR90868
     167  
     168     C++: ICE during gimplification.  */
     169  #else
     170  void
     171  f_pr90868_data (void)
     172  {
     173  #pragma acc data
     174    {
     175      extern int we0;
     176  # pragma acc declare create(we0) /* { dg-error "variable 'we0' used more than once with '#pragma acc declare'" "" { target c } } */
     177  
     178      extern int we1;
     179  # pragma acc declare copyin(we1) /* { dg-error "variable 'we1' used more than once with '#pragma acc declare'" "" { target c } } */
     180  
     181      extern int *we2;
     182  # pragma acc declare deviceptr(we2) /* { dg-error "variable 'we2' used more than once with '#pragma acc declare'" "" { target c } } */
     183  
     184      extern int we3;
     185  # pragma acc declare device_resident(we3) /* { dg-error "variable 'we3' used more than once with '#pragma acc declare'" "" { target c } } */
     186  
     187      extern int we4;
     188  # pragma acc declare link(we4) /* { dg-error "variable 'we4' used more than once with '#pragma acc declare'" "" { target c } } */
     189  
     190      extern int we5;
     191  # pragma acc declare present_or_copyin(we5) /* { dg-error "variable 'we5' used more than once with '#pragma acc declare'" "" { target c } } */
     192   
     193      extern int we6;
     194  # pragma acc declare present_or_create(we6) /* { dg-error "variable 'we6' used more than once with '#pragma acc declare'" "" { target c } } */
     195    }
     196  }
     197  #endif