/* Test invalid use of the OpenACC 'declare' directive. */ #pragma acc declare /* { dg-error "no valid clauses" } */ #pragma acc declare create(undeclared) /* { dg-error "undeclared" } */ /* { dg-error "no valid clauses" "second error" { target *-*-* } .-1 } */ int v0[10]; #pragma acc declare create(v0[1:3]) /* { dg-error "array section" } */ int v1; #pragma acc declare create(v1, v1) /* { dg-error "more than once" } */ int v2; #pragma acc declare create(v2) #pragma acc declare copyin(v2) /* { dg-error "more than once" } */ int v3; #pragma acc declare copy(v3) /* { dg-error "at file scope" } */ int v4; #pragma acc declare copyout(v4) /* { dg-error "at file scope" } */ int v5; #pragma acc declare present(v5) /* { dg-error "at file scope" } */ int v6; #pragma acc declare present_or_copy(v6) /* { dg-error "at file scope" } */ int v7; #pragma acc declare present_or_copyout(v7) /* { dg-error "at file scope" } */ int va10; #pragma acc declare create (va10) #pragma acc declare link (va10) /* { dg-error "more than once" } */ int va11; #pragma acc declare link (va11) #pragma acc declare link (va11) /* { dg-error "more than once" } */ int va12; #pragma acc declare create (va12) link (va12) /* { dg-error "more than once" } */ void f (void) { int va0; #pragma acc declare link(va0) /* { dg-error "global variable" } */ extern int ve0; #pragma acc declare copy(ve0) /* { dg-error "invalid use of" } */ extern int ve1; #pragma acc declare copyout(ve1) /* { dg-error "invalid use of" } */ extern int ve2; #pragma acc declare present(ve2) /* { dg-error "invalid use of" } */ extern int ve3; #pragma acc declare present_or_copy(ve3) /* { dg-error "invalid use of" } */ extern int ve4; #pragma acc declare present_or_copyout(ve4) /* { dg-error "invalid use of" } */ #pragma acc declare present (v2) /* { dg-error "invalid use of" } */ } /* The same as 'f' but everything contained in an OpenACC 'data' construct. */ void f_data (void) { #pragma acc data { int va0; # pragma acc declare link(va0) /* { dg-error "global variable" } */ extern int ve0; # pragma acc declare copy(ve0) /* { dg-error "invalid use of" } */ extern int ve1; # pragma acc declare copyout(ve1) /* { dg-error "invalid use of" } */ extern int ve2; # pragma acc declare present(ve2) /* { dg-error "invalid use of" } */ extern int ve3; # pragma acc declare present_or_copy(ve3) /* { dg-error "invalid use of" } */ extern int ve4; # pragma acc declare present_or_copyout(ve4) /* { dg-error "invalid use of" } */ # pragma acc declare present (v2) /* { dg-error "invalid use of" } */ } } /* Testing for PR90868 "Duplicate OpenACC 'declare' directives for 'extern' variables". */ void f_pr90868 (void) { extern int we0; #pragma acc declare create(we0) extern int we1; #pragma acc declare copyin(we1) extern int *we2; #pragma acc declare deviceptr(we2) extern int we3; #pragma acc declare device_resident(we3) extern int we4; #pragma acc declare link(we4) extern int we5; #pragma acc declare present_or_copyin(we5) extern int we6; #pragma acc declare present_or_create(we6) } /* The same as 'f_pr90868'. */ /* The errors are emitted for C only; for C++, the duplicate OpenACC 'declare' directives for 'extern' variables are accepted. */ void f_pr90868_2 (void) { extern int we0; #pragma acc declare create(we0) /* { dg-error "variable 'we0' used more than once with '#pragma acc declare'" } */ extern int we1; #pragma acc declare copyin(we1) /* { dg-error "variable 'we1' used more than once with '#pragma acc declare'" } */ extern int *we2; #pragma acc declare deviceptr(we2) /* { dg-error "variable 'we2' used more than once with '#pragma acc declare'" } */ extern int we3; #pragma acc declare device_resident(we3) /* { dg-error "variable 'we3' used more than once with '#pragma acc declare'" } */ extern int we4; #pragma acc declare link(we4) /* { dg-error "variable 'we4' used more than once with '#pragma acc declare'" } */ extern int we5; #pragma acc declare present_or_copyin(we5) /* { dg-error "variable 'we5' used more than once with '#pragma acc declare'" } */ extern int we6; #pragma acc declare present_or_create(we6) /* { dg-error "variable 'we6' used more than once with '#pragma acc declare'" } */ } /* The same as 'f_pr90868' but everything contained in an OpenACC 'data' construct. */ void f_pr90868_data (void) { #pragma acc data { extern int we0; # pragma acc declare create(we0) /* { dg-error "variable 'we0' used more than once with '#pragma acc declare'" } */ extern int we1; # pragma acc declare copyin(we1) /* { dg-error "variable 'we1' used more than once with '#pragma acc declare'" } */ extern int *we2; # pragma acc declare deviceptr(we2) /* { dg-error "variable 'we2' used more than once with '#pragma acc declare'" } */ extern int we3; # pragma acc declare device_resident(we3) /* { dg-error "variable 'we3' used more than once with '#pragma acc declare'" } */ extern int we4; # pragma acc declare link(we4) /* { dg-error "variable 'we4' used more than once with '#pragma acc declare'" } */ extern int we5; # pragma acc declare present_or_copyin(we5) /* { dg-error "variable 'we5' used more than once with '#pragma acc declare'" } */ extern int we6; # pragma acc declare present_or_create(we6) /* { dg-error "variable 'we6' used more than once with '#pragma acc declare'" } */ } }