From 5c9c7e19e63e0a6d9ed9e51601b4221f2fed5b13 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Wed, 19 Jun 2019 00:14:04 +0200 Subject: [PATCH] [PR90868] Document status quo for duplicate OpenACC 'declare' directives for 'extern' variables gcc/testsuite/ PR testsuite/90868 * c-c++-common/goacc/declare-1.c: Update. * c-c++-common/goacc/declare-2.c: Likewise. From-SVN: r272445 --- gcc/testsuite/ChangeLog | 4 + gcc/testsuite/c-c++-common/goacc/declare-1.c | 85 ++++++++++++++++- gcc/testsuite/c-c++-common/goacc/declare-2.c | 99 ++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 473fd66d39f..981055838ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2019-06-18 Thomas Schwinge + PR testsuite/90868 + * c-c++-common/goacc/declare-1.c: Update. + * c-c++-common/goacc/declare-2.c: Likewise. + PR middle-end/90862 * c-c++-common/goacc/declare-1.c: Update. * c-c++-common/goacc/declare-2.c: Likewise. diff --git a/gcc/testsuite/c-c++-common/goacc/declare-1.c b/gcc/testsuite/c-c++-common/goacc/declare-1.c index 7c4380f4f04..46ee01b6759 100644 --- a/gcc/testsuite/c-c++-common/goacc/declare-1.c +++ b/gcc/testsuite/c-c++-common/goacc/declare-1.c @@ -96,6 +96,84 @@ f (void) } +/* The same as 'f'. */ + +void +f_2 (void) +{ + int va0; +#pragma acc declare create(va0) + + int va1; +#pragma acc declare copyin(va1) + + int *va2; +#pragma acc declare deviceptr(va2) + + int va3; +#pragma acc declare device_resident(va3) + +#ifndef __cplusplus + /* TODO PR90868 + + C: "error: variable '[...]' used more than once with '#pragma acc declare'". */ +#else + extern int ve0; +#pragma acc declare create(ve0) + + extern int ve1; +#pragma acc declare copyin(ve1) + + extern int *ve2; +#pragma acc declare deviceptr(ve2) + + extern int ve3; +#pragma acc declare device_resident(ve3) + + extern int ve4; +#pragma acc declare link(ve4) + + extern int ve5; +#pragma acc declare present_or_copyin(ve5) + + extern int ve6; +#pragma acc declare present_or_create(ve6) +#endif + + int va5; +#pragma acc declare copy(va5) + + int va6; +#pragma acc declare copyout(va6) + + int va7; +#pragma acc declare present(va7) + + int va8; +#pragma acc declare present_or_copy(va8) + + int va9; +#pragma acc declare present_or_copyin(va9) + + int va10; +#pragma acc declare present_or_copyout(va10) + + int va11; +#pragma acc declare present_or_create(va11) + + a: + { + int va0; +#pragma acc declare create(va0) + if (v1) + goto a; + else + goto b; + } + b:; +} + + /* The same as 'f' but everything contained in an OpenACC 'data' construct. */ void @@ -115,7 +193,12 @@ f_data (void) int va3; # pragma acc declare device_resident(va3) -#if 0 /* TODO */ +#if 0 + /* TODO PR90868 + + C: "error: variable '[...]' used more than once with '#pragma acc declare'". + C++: ICE during gimplification. */ + extern int ve0; # pragma acc declare create(ve0) diff --git a/gcc/testsuite/c-c++-common/goacc/declare-2.c b/gcc/testsuite/c-c++-common/goacc/declare-2.c index af43b6bc816..e2e22be57e9 100644 --- a/gcc/testsuite/c-c++-common/goacc/declare-2.c +++ b/gcc/testsuite/c-c++-common/goacc/declare-2.c @@ -96,3 +96,102 @@ f_data (void) # 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'" "" { target c } } */ + + extern int we1; +#pragma acc declare copyin(we1) /* { dg-error "variable 'we1' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int *we2; +#pragma acc declare deviceptr(we2) /* { dg-error "variable 'we2' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we3; +#pragma acc declare device_resident(we3) /* { dg-error "variable 'we3' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we4; +#pragma acc declare link(we4) /* { dg-error "variable 'we4' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we5; +#pragma acc declare present_or_copyin(we5) /* { dg-error "variable 'we5' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we6; +#pragma acc declare present_or_create(we6) /* { dg-error "variable 'we6' used more than once with '#pragma acc declare'" "" { target c } } */ +} + + +/* The same as 'f_pr90868' but everything contained in an OpenACC 'data' + construct. */ + +#ifdef __cplusplus +/* TODO PR90868 + + C++: ICE during gimplification. */ +#else +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'" "" { target c } } */ + + extern int we1; +# pragma acc declare copyin(we1) /* { dg-error "variable 'we1' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int *we2; +# pragma acc declare deviceptr(we2) /* { dg-error "variable 'we2' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we3; +# pragma acc declare device_resident(we3) /* { dg-error "variable 'we3' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we4; +# pragma acc declare link(we4) /* { dg-error "variable 'we4' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we5; +# pragma acc declare present_or_copyin(we5) /* { dg-error "variable 'we5' used more than once with '#pragma acc declare'" "" { target c } } */ + + extern int we6; +# pragma acc declare present_or_create(we6) /* { dg-error "variable 'we6' used more than once with '#pragma acc declare'" "" { target c } } */ + } +} +#endif -- 2.30.2