https://gcc.gnu.org/g:96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4

commit r15-3834-g96246bff0bcd9e5cdec9e6cf811ee3db4997f6d4
Author: Sandra Loosemore <sloosem...@baylibre.com>
Date:   Fri Sep 6 20:58:13 2024 +0000

    OpenMP: Check additional restrictions on context selector properties
    
    TR13 (pre-6.0) of the OpenMP spec says:
    
    "Each trait-property may only be specified once in a trait selector
    other than those in the construct selector set."
    
    and
    
    "If trait-property any is specified in the kind trait-selector of the
    device selector set or the target_device selector sets, no other
    trait-property may be specified in the same selector set."
    
    These restrictions (with slightly different wording) date back to
    OpenMP 5.1, but were not in 5.0 which was the basis for GCC's
    implementation.
    
    This patch adds a diagnostic, adds new testcases, and fixes some older
    testcases that include now-invalid selectors.
    
    gcc/ChangeLog
            * omp-general.cc (omp_check_context_selector): Reject other
            properties in the same selector set with kind(any).  Also reject
            duplicate name-list properties.
    
    gcc/testsuite/ChangeLog
            * c-c++-common/gomp/declare-variant-10.c: Fix broken tests.
            * c-c++-common/gomp/declare-variant-3.c: Likewise.
            * c-c++-common/gomp/declare-variant-9.c: Likewise.
            * c-c++-common/gomp/declare-variant-any.c: New.
            * c-c++-common/gomp/declare-variant-duplicates.c: New.
            * gfortran.dg/gomp/declare-variant-10.f90: Fix broken tests.
            * gfortran.dg/gomp/declare-variant-3.f90: Likewise.
            * gfortran.dg/gomp/declare-variant-9.f90: Likewise.
            * gfortran.dg/gomp/declare-variant-any.f90: New.
            * gfortran.dg/gomp/declare-variant-duplicates.f90: New.

Diff:
---
 gcc/omp-general.cc                                 | 64 +++++++++++++++++++++-
 .../c-c++-common/gomp/declare-variant-10.c         |  4 +-
 .../c-c++-common/gomp/declare-variant-3.c          | 10 +---
 .../c-c++-common/gomp/declare-variant-9.c          |  4 +-
 .../c-c++-common/gomp/declare-variant-any.c        | 17 ++++++
 .../c-c++-common/gomp/declare-variant-duplicates.c | 13 +++++
 .../gfortran.dg/gomp/declare-variant-10.f90        |  4 +-
 .../gfortran.dg/gomp/declare-variant-3.f90         | 12 +---
 .../gfortran.dg/gomp/declare-variant-9.f90         |  2 +-
 .../gfortran.dg/gomp/declare-variant-any.f90       | 40 ++++++++++++++
 .../gomp/declare-variant-duplicates.f90            | 30 ++++++++++
 11 files changed, 176 insertions(+), 24 deletions(-)

diff --git a/gcc/omp-general.cc b/gcc/omp-general.cc
index c93bf129e4d7..9713e684e830 100644
--- a/gcc/omp-general.cc
+++ b/gcc/omp-general.cc
@@ -1293,6 +1293,8 @@ omp_check_context_selector (location_t loc, tree ctx)
   for (tree tss = ctx; tss; tss = TREE_CHAIN (tss))
     {
       enum omp_tss_code tss_code = OMP_TSS_CODE (tss);
+      bool saw_any_prop = false;
+      bool saw_other_prop = false;
 
       /* We can parse this, but not handle it yet.  */
       if (tss_code == OMP_TRAIT_SET_TARGET_DEVICE)
@@ -1329,9 +1331,61 @@ omp_check_context_selector (location_t loc, tree ctx)
          else
            ts_seen[ts_code] = true;
 
+         /* If trait-property "any" is specified in the "kind"
+            trait-selector of the "device" selector set or the
+            "target_device" selector sets, no other trait-property
+            may be specified in the same selector set.  */
+         if (ts_code == OMP_TRAIT_DEVICE_KIND)
+           for (tree p = OMP_TS_PROPERTIES (ts); p; p = TREE_CHAIN (p))
+             {
+               const char *prop = omp_context_name_list_prop (p);
+               if (!prop)
+                 continue;
+               else if (strcmp (prop, "any") == 0)
+                 saw_any_prop = true;
+               else
+                 saw_other_prop = true;
+             }
+         /* It seems slightly suspicious that the spec's language covers
+            the device_num selector too, but
+              target_device={device_num(whatever),kind(any)}
+            is probably not terribly useful anyway.  */
+         else if (ts_code == OMP_TRAIT_DEVICE_ARCH
+                  || ts_code == OMP_TRAIT_DEVICE_ISA
+                  || ts_code == OMP_TRAIT_DEVICE_NUM)
+           saw_other_prop = true;
+
+         /* Each trait-property can only be specified once in a trait-selector
+            other than the construct selector set.  FIXME: only handles
+            name-list properties, not clause-list properties, since the
+            "requires" selector is not implemented yet (PR 113067).  */
+         if (tss_code != OMP_TRAIT_SET_CONSTRUCT)
+           for (tree p1 = OMP_TS_PROPERTIES (ts); p1; p1 = TREE_CHAIN (p1))
+             {
+               if (OMP_TP_NAME (p1) != OMP_TP_NAMELIST_NODE)
+                 break;
+               const char *n1 = omp_context_name_list_prop (p1);
+               if (!n1)
+                 continue;
+               for (tree p2 = TREE_CHAIN (p1); p2; p2 = TREE_CHAIN (p2))
+                 {
+                   const char *n2 = omp_context_name_list_prop (p2);
+                   if (!n2)
+                     continue;
+                   if (!strcmp (n1, n2))
+                     {
+                       error_at (loc,
+                                 "trait-property %qs specified more "
+                                 "than once in %qs selector",
+                                 n1, OMP_TS_NAME (ts));
+                       return error_mark_node;
+                     }
+                 }
+             }
+
+         /* Check for unknown properties.  */
          if (omp_ts_map[ts_code].valid_properties == NULL)
            continue;
-
          for (tree p = OMP_TS_PROPERTIES (ts); p; p = TREE_CHAIN (p))
            for (unsigned j = 0; ; j++)
              {
@@ -1381,6 +1435,14 @@ omp_check_context_selector (location_t loc, tree ctx)
                  break;
              }
        }
+
+      if (saw_any_prop && saw_other_prop)
+       {
+         error_at (loc,
+                   "no other trait-property may be specified "
+                   "in the same selector set with %<kind(\"any\")%>");
+         return error_mark_node;
+       }
     }
   return ctx;
 }
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c 
b/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c
index 2b8a39425b13..e77693430d1a 100644
--- a/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c
+++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-10.c
@@ -7,7 +7,7 @@ void f01 (void);
 #pragma omp declare variant (f01) match (device={isa(avx512f,avx512bw)})
 void f02 (void);
 void f03 (void);
-#pragma omp declare variant (f03) match 
(device={kind("any"),arch(x86_64),isa(avx512f,avx512bw)})
+#pragma omp declare variant (f03) match 
(device={arch(x86_64),isa(avx512f,avx512bw)})
 void f04 (void);
 void f05 (void);
 #pragma omp declare variant (f05) match (device={kind(gpu)})
@@ -28,7 +28,7 @@ void f15 (void);
 #pragma omp declare variant (f15) match (device={isa(sse4,ssse3),arch(i386)})
 void f16 (void);
 void f17 (void);
-#pragma omp declare variant (f17) match (device={kind(any,fpga)})
+#pragma omp declare variant (f17) match (device={kind(fpga)})
 void f18 (void);
 
 #pragma omp declare target
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c 
b/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c
index f5d7797f4584..0d772d7aaaba 100644
--- a/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c
+++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-3.c
@@ -29,13 +29,13 @@ void f17 (void);
 void f18 (void);
 #pragma omp declare variant (f13) match (device={kind(fpga)})
 void f19 (void);
-#pragma omp declare variant (f13) match (device={kind(any,any)})
+#pragma omp declare variant (f13) match (device={kind(any)})
 void f20 (void);
 #pragma omp declare variant (f13) match (device={kind(host,nohost)})
 void f21 (void);
 #pragma omp declare variant (f13) match (device={kind("cpu","gpu","fpga")})
 void f22 (void);
-#pragma omp declare variant (f13) match (device={kind(any,cpu,nohost)})
+#pragma omp declare variant (f13) match (device={kind(cpu,nohost)})
 void f23 (void);
 #pragma omp declare variant (f13) match (device={isa(avx)})
 void f24 (void);
@@ -139,12 +139,8 @@ void f72 (void);
 void f73 (void);
 #pragma omp declare variant (f13) match (user={condition(score(25):1)})
 void f74 (void);
-#pragma omp declare variant (f13) match (device={kind(any,"any")})
+#pragma omp declare variant (f13) match (device={kind("any")})
 void f75 (void);
-#pragma omp declare variant (f13) match (device={kind("any","any")})
-void f76 (void);
-#pragma omp declare variant (f13) match (device={kind("any",any)})
-void f77 (void);
 #pragma omp declare variant (f13) match (implementation={vendor(nvidia)})
 void f78 (void);
 #pragma omp declare variant (f13) match (user={condition(score(0):0)})
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c 
b/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c
index 5ee75892f2de..da96c81eb6fa 100644
--- a/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c
+++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-9.c
@@ -7,7 +7,7 @@ void f01 (void);
 #pragma omp declare variant (f01) match (device={isa("avx512f",avx512bw)})
 void f02 (void);
 void f03 (void);
-#pragma omp declare variant (f03) match 
(device={kind(any),arch(x86_64),isa("avx512f","avx512bw")})
+#pragma omp declare variant (f03) match 
(device={arch(x86_64),isa("avx512f","avx512bw")})
 void f04 (void);
 void f05 (void);
 #pragma omp declare variant (f05) match (device={kind(gpu)})
@@ -28,7 +28,7 @@ void f15 (void);
 #pragma omp declare variant (f15) match (device={isa(sse4,ssse3),arch(i386)})
 void f16 (void);
 void f17 (void);
-#pragma omp declare variant (f17) match (device={kind("any","fpga")})
+#pragma omp declare variant (f17) match (device={kind("fpga")})
 void f18 (void);
 
 void
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c 
b/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c
new file mode 100644
index 000000000000..cddf73b64d46
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-any.c
@@ -0,0 +1,17 @@
+/* Check that errors are detected if other trait-properties are given with
+   kind(any).  */
+
+extern int f1 (int);
+extern int f2 (int);
+extern int f3 (int);
+extern int f4 (int);
+extern int f5 (int);
+extern int f6 (int);
+
+#pragma omp declare variant (f1) match (device={kind(any,gpu)})  /* { dg-error 
"no other trait-property may be specified" } */
+#pragma omp declare variant (f2) match (device={kind(cpu,"any")})  /* { 
dg-error "no other trait-property may be specified" } */
+#pragma omp declare variant (f3) match (device={kind("any"),arch(x86_64)})  /* 
{ dg-error "no other trait-property may be specified" } */
+#pragma omp declare variant (f4) match (device={arch(x86_64),kind(any)})  /* { 
dg-error "no other trait-property may be specified" } */
+#pragma omp declare variant (f5) match (device={kind(any,"any")})  /* { 
dg-error "trait-property .any. specified more than once" } */
+#pragma omp declare variant (f6) match (device={kind("any",any)})  /* { 
dg-error "trait-property .any. specified more than once" } */
+int f (int);
diff --git a/gcc/testsuite/c-c++-common/gomp/declare-variant-duplicates.c 
b/gcc/testsuite/c-c++-common/gomp/declare-variant-duplicates.c
new file mode 100644
index 000000000000..47d34fc52e2f
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/declare-variant-duplicates.c
@@ -0,0 +1,13 @@
+/* Check that errors are detected if duplicates appear in name-list
+   properties.  */
+
+extern int f1 (int);
+extern int f2 (int);
+extern int f3 (int);
+extern int f4 (int);
+
+#pragma omp declare variant (f1) match (device={kind(cpu,gpu,"cpu")})  /* { 
dg-error "trait-property .cpu. specified more than once" } */
+#pragma omp declare variant (f2) match (device={isa(sse4,"avx",avx)})  /* { 
dg-error "trait-property .avx. specified more than once" } */
+#pragma omp declare variant (f3) match 
(device={arch(x86_64,i386,aarch64,"i386")})  /* { dg-error "trait-property 
.i386. specified more than once" } */
+#pragma omp declare variant (f4) match 
(implementation={vendor(llvm,gnu,"arm",gnu)})  /* { dg-error "trait-property 
.gnu. specified more than once" } */
+int f (int);
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90 
b/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90
index 2f09146a10d2..01f59c528087 100644
--- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-10.f90
@@ -15,7 +15,7 @@ contains
   subroutine f03 ()
   end subroutine
   subroutine f04 ()
-    !$omp declare variant (f03) match 
(device={kind("any"),arch(x86_64),isa(avx512f,avx512bw)})
+    !$omp declare variant (f03) match 
(device={arch(x86_64),isa(avx512f,avx512bw)})
   end subroutine
   subroutine f05 ()
   end subroutine
@@ -50,7 +50,7 @@ contains
   subroutine f17 ()
   end subroutine
   subroutine f18 ()
-    !$omp declare variant (f17) match (device={kind(any,fpga)})
+    !$omp declare variant (f17) match (device={kind(fpga)})
   end subroutine
 
   subroutine test1 ()
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90 
b/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90
index 90674281f226..891f1d282a53 100644
--- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-3.f90
@@ -51,7 +51,7 @@ contains
     !$omp declare variant (f13) match (device={kind(fpga)})
   end subroutine
   subroutine f20 ()
-    !$omp declare variant (f13) match (device={kind(any,any)})
+    !$omp declare variant (f13) match (device={kind(any)})
   end subroutine
   subroutine f21 ()
     !$omp declare variant (f13) match (device={kind(host,nohost)})
@@ -60,7 +60,7 @@ contains
     !$omp declare variant (f13) match (device={kind("cpu","gpu","fpga")})
   end subroutine
   subroutine f23 ()
-    !$omp declare variant (f13) match (device={kind(any,cpu,nohost)})
+    !$omp declare variant (f13) match (device={kind(cpu,nohost)})
   end subroutine
   subroutine f24 ()
     !$omp declare variant (f13) match (device={isa(avx)})
@@ -222,13 +222,7 @@ contains
     !$omp declare variant (f13) match (user={condition(score(25):.true.)})
   end subroutine
   subroutine f75 ()
-    !$omp declare variant (f13) match (device={kind(any,"any")})
-  end subroutine
-  subroutine f76 ()
-    !$omp declare variant (f13) match (device={kind("any","any")})
-  end subroutine
-  subroutine f77 ()
-    !$omp declare variant (f13) match (device={kind("any",any)})
+    !$omp declare variant (f13) match (device={kind("any")})
   end subroutine
   subroutine f78 ()
     !$omp declare variant (f13) match (implementation={vendor(nvidia)})
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90 
b/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90
index ebd066609f3a..297bff97d5e0 100644
--- a/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-9.f90
@@ -38,7 +38,7 @@ contains
   subroutine f17 ()
   end subroutine
   subroutine f18 ()
-    !$omp declare variant (f17) match (device={kind("any","fpga")})
+    !$omp declare variant (f17) match (device={kind("fpga")})
   end subroutine
 
   subroutine test1 ()
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90 
b/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90
new file mode 100644
index 000000000000..c22e27c0c811
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-any.f90
@@ -0,0 +1,40 @@
+! Check that errors are detected if other trait-properties are given with
+! kind(any).
+
+integer function f1 (x)
+  integer, intent(in) :: x
+  f1 = x + 1
+end function
+integer function f2 (x)
+  integer, intent(in) :: x
+  f2 = x + 2
+end function
+integer function f3 (x)
+  integer, intent(in) :: x
+  f3 = x + 3
+end function
+integer function f4 (x)
+  integer, intent(in) :: x
+  f4 = x + 4
+end function
+integer function f5 (x)
+  integer, intent(in) :: x
+  f4 = x + 5
+end function
+integer function f6 (x)
+  integer, intent(in) :: x
+  f4 = x + 6
+end function
+
+integer function f (x)
+  integer, intent(in) :: x
+
+  !$omp declare variant (f1) match (device={kind(any,gpu)})  ! { dg-error "no 
other trait-property may be specified" }
+  !$omp declare variant (f2) match (device={kind(cpu,"any")})  ! { dg-error 
"no other trait-property may be specified" }
+  !$omp declare variant (f3) match (device={kind("any"),arch(x86_64)})  ! { 
dg-error "no other trait-property may be specified" }
+  !$omp declare variant (f4) match (device={arch(x86_64),kind(any)})  ! { 
dg-error "no other trait-property may be specified" }
+  !$omp declare variant (f5) match (device={kind(any,"any")})  ! { dg-error 
"trait-property .any. specified more than once" }
+  !$omp declare variant (f6) match (device={kind("any",any)})  ! { dg-error 
"trait-property .any. specified more than once" }
+
+  f = x
+end function  
diff --git a/gcc/testsuite/gfortran.dg/gomp/declare-variant-duplicates.f90 
b/gcc/testsuite/gfortran.dg/gomp/declare-variant-duplicates.f90
new file mode 100644
index 000000000000..16dc0858ff96
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/declare-variant-duplicates.f90
@@ -0,0 +1,30 @@
+! Check that errors are detected if duplicates appear in name-list
+! properties.
+
+integer function f1 (x)
+  integer, intent(in) :: x
+  f1 = x + 1
+end function
+integer function f2 (x)
+  integer, intent(in) :: x
+  f2 = x + 2
+end function
+integer function f3 (x)
+  integer, intent(in) :: x
+  f3 = x + 3
+end function
+integer function f4 (x)
+  integer, intent(in) :: x
+  f4 = x + 4
+end function
+
+integer function f (x)
+  integer, intent(in) :: x
+
+  !$omp declare variant (f1) match (device={kind(cpu,gpu,"cpu")})  ! { 
dg-error "trait-property .cpu. specified more than once" }
+  !$omp declare variant (f2) match (device={isa(sse4,"avx",avx)})  ! { 
dg-error "trait-property .avx. specified more than once" }
+  !$omp declare variant (f3) match (device={arch(x86_64,i386,aarch64,"i386")}) 
 ! { dg-error "trait-property .i386. specified more than once" }
+  !$omp declare variant (f4) match 
(implementation={vendor(llvm,gnu,"arm",gnu)})  ! { dg-error "trait-property 
.gnu. specified more than once" }
+
+  f = x
+end function

Reply via email to