[PR90868] Document status quo for duplicate OpenACC 'declare' directives for 'extern...
authorThomas Schwinge <thomas@codesourcery.com>
Tue, 18 Jun 2019 22:14:04 +0000 (00:14 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Tue, 18 Jun 2019 22:14:04 +0000 (00:14 +0200)
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
gcc/testsuite/c-c++-common/goacc/declare-1.c
gcc/testsuite/c-c++-common/goacc/declare-2.c

index 473fd66d39fd5a9d115ffe68c5b8878850840143..981055838ab656f282f487b51a7fa076aafaf81a 100644 (file)
@@ -1,5 +1,9 @@
 2019-06-18  Thomas Schwinge  <thomas@codesourcery.com>
 
+       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.
index 7c4380f4f04191cad106dab930583c6d49cc3eb1..46ee01b675950727a52e1c2e5bd585c38e06c050 100644 (file)
@@ -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)
 
index af43b6bc816261d49d6944b02ed139b324d2fa08..e2e22be57e9e4c592f8fac5546ef18053196eb80 100644 (file)
@@ -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