diff options
author | Sandra Loosemore <sloosemore@baylibre.com> | 2025-03-31 22:02:35 +0000 |
---|---|---|
committer | Sandra Loosemore <sloosemore@baylibre.com> | 2025-04-02 14:44:26 +0000 |
commit | aca8155c09001f269a20d6df438fa0e749dd5388 (patch) | |
tree | f3d8ef0c9d0b4865fce220b431a9182687c13675 /gcc/testsuite/c-c++-common | |
parent | 17ed44c96f6e5c0cc02d8cb29ff5943dd30ab3c1 (diff) | |
download | gcc-aca8155c09001f269a20d6df438fa0e749dd5388.zip gcc-aca8155c09001f269a20d6df438fa0e749dd5388.tar.gz gcc-aca8155c09001f269a20d6df438fa0e749dd5388.tar.bz2 |
OpenMP: Require target and/or targetsync init modifier [PR118965]
As noted in PR 118965, the initial interop implementation overlooked
the requirement in the OpenMP spec that at least one of the "target"
and "targetsync" modifiers is required in both the interop construct
init clause and the declare variant append_args clause.
Adding the check was fairly straightforward, but it broke about a
gazillion existing test cases. In particular, things like "init (x, y)"
which were previously accepted (and tested for being accepted) aren't
supposed to be allowed by the spec, much less things like "init (target)"
where target was previously interpreted as a variable name instead of a
modifier. Since one of the effects of the change is that at least one
modifier is always required, I found that deleting all the code that was
trying to detect and handle the no-modifier case allowed for better
diagnostics.
gcc/c/ChangeLog
PR middle-end/118965
* c-parser.cc (c_parser_omp_clause_init_modifiers): Adjust
error message.
(c_parser_omp_clause_init): Remove code for recognizing clauses
without modifiers. Diagnose missing target/targetsync modifier.
(c_finish_omp_declare_variant): Diagnose missing target/targetsync
modifier.
gcc/cp/ChangeLog
PR middle-end/118965
* parser.cc (c_parser_omp_clause_init_modifiers): Adjust
error message.
(cp_parser_omp_clause_init): Remove code for recognizing clauses
without modifiers. Diagnose missing target/targetsync modifier.
(cp_finish_omp_declare_variant): Diagnose missing target/targetsync
modifier.
gcc/fortran/ChangeLog
PR middle-end/118965
* openmp.cc (gfc_parser_omp_clause_init_modifiers): Fix some
inconsistent code indentation. Remove code for recognizing
clauses without modifiers. Diagnose prefer_type without a
following paren. Adjust error message for an unrecognized modifier.
Diagnose missing target/targetsync modifier.
(gfc_match_omp_init): Fix more inconsistent code indentation.
gcc/testsuite/ChangeLog
PR middle-end/118965
* c-c++-common/gomp/append-args-1.c: Add target/targetsync
modifiers so tests do what they were previously supposed to do.
Adjust expected output.
* c-c++-common/gomp/append-args-7.c: Likewise.
* c-c++-common/gomp/append-args-8.c: Likewise.
* c-c++-common/gomp/append-args-9.c: Likewise.
* c-c++-common/gomp/interop-1.c: Likewise.
* c-c++-common/gomp/interop-2.c: Likewise.
* c-c++-common/gomp/interop-3.c: Likewise.
* c-c++-common/gomp/interop-4.c: Likewise.
* c-c++-common/gomp/pr118965-1.c: New.
* c-c++-common/gomp/pr118965-2.c: New.
* g++.dg/gomp/append-args-1.C: Add target/targetsync modifiers
and adjust expected output.
* g++.dg/gomp/append-args-2.C: Likewise.
* g++.dg/gomp/append-args-6.C: Likewise.
* g++.dg/gomp/append-args-7.C: Likewise.
* g++.dg/gomp/append-args-8.C: Likewise.
* g++.dg/gomp/interop-5.C: Likewise.
* gfortran.dg/gomp/append_args-1.f90: Add target/targetsync
modifiers and adjust expected output.
* gfortran.dg/gomp/append_args-2.f90: Likewise.
* gfortran.dg/gomp/append_args-3.f90: Likewise.
* gfortran.dg/gomp/append_args-4.f90: Likewise.
* gfortran.dg/gomp/interop-1.f90: Likewise.
* gfortran.dg/gomp/interop-2.f90: Likewise.
* gfortran.dg/gomp/interop-3.f90: Likewise.
* gfortran.dg/gomp/interop-4.f90: Likewise.
* gfortran.dg/gomp/pr118965-1.f90: New.
* gfortran.dg/gomp/pr118965-2.f90: New.
Diffstat (limited to 'gcc/testsuite/c-c++-common')
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/append-args-1.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/append-args-7.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/append-args-8.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/append-args-9.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/interop-1.c | 80 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/interop-2.c | 64 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/interop-3.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/interop-4.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/pr118965-1.c | 57 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/pr118965-2.c | 31 |
10 files changed, 179 insertions, 111 deletions
diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-1.c b/gcc/testsuite/c-c++-common/gomp/append-args-1.c index e03b8de..e8561a5 100644 --- a/gcc/testsuite/c-c++-common/gomp/append-args-1.c +++ b/gcc/testsuite/c-c++-common/gomp/append-args-1.c @@ -27,12 +27,12 @@ float base1(); void repl2(int *, int *, omp_interop_t, omp_interop_t); #pragma omp declare variant(repl2) match(construct={dispatch}) adjust_args(need_device_ptr : y) \ append_args(interop(target, targetsync, prefer_type(1)), \ - interop(prefer_type({fr(3), attr("ompx_nop")},{fr(2)},{attr("ompx_all")}))) + interop(target, prefer_type({fr(3), attr("ompx_nop")},{fr(2)},{attr("ompx_all")}))) void base2(int *x, int *y); void repl3(int, omp_interop_t, ...); #pragma omp declare variant(repl3) match(construct={dispatch}) \ - append_args(interop(prefer_type("cuda", "hsa"))) + append_args(interop(target, prefer_type("cuda", "hsa"))) void base3(int, ...); /* { dg-note "'declare variant' candidate 'repl3' declared here" "" { target c } .-2 } */ /* { dg-note "'declare variant' candidate 'void repl3\\(int, omp_interop_t, \\.\\.\\.\\)' declared here" "" { target c++ } .-3 } */ diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-7.c b/gcc/testsuite/c-c++-common/gomp/append-args-7.c index b7dff8a..d8a853e 100644 --- a/gcc/testsuite/c-c++-common/gomp/append-args-7.c +++ b/gcc/testsuite/c-c++-common/gomp/append-args-7.c @@ -20,14 +20,14 @@ void g1(...) { } void f2(...) { } /* { dg-error "argument 1 of 'f2' must be of 'omp_interop_t'" "" { target c } .-1 } */ /* { dg-error "argument 1 of 'void f2\\(\\.\\.\\.\\)' must be of 'omp_interop_t'" "" { target c++ } .-2 } */ -#pragma omp declare variant(f2) append_args(interop(target), interop(prefer_type("cuda"))) \ +#pragma omp declare variant(f2) append_args(interop(target), interop(target, prefer_type("cuda"))) \ match(construct={dispatch}) void g2(...) { } /* { dg-note "'append_args' specified here" "" { target *-*-* } .-3 } */ void f3(omp_interop_t, omp_interop_t, ...) { } -#pragma omp declare variant(f3) append_args(interop(target), interop(prefer_type("cuda"))) \ +#pragma omp declare variant(f3) append_args(interop(target), interop(target, prefer_type("cuda"))) \ match(construct={dispatch}) void g3(...) { } diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-8.c b/gcc/testsuite/c-c++-common/gomp/append-args-8.c index fb442db..d47faa2 100644 --- a/gcc/testsuite/c-c++-common/gomp/append-args-8.c +++ b/gcc/testsuite/c-c++-common/gomp/append-args-8.c @@ -14,14 +14,15 @@ typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM void f1(omp_interop_t) { } #pragma omp declare variant(f1) match(construct={dispatch}) \ - append_args(interop(prefer_type({attr("ompx_fun")}))) + append_args(interop(target, prefer_type({attr("ompx_fun")}))) void g1(void); int f2(omp_interop_t, omp_interop_t); -#pragma omp declare variant(f2) append_args(interop(prefer_type("cuda")), \ - interop(prefer_type({fr("hsa")}),target)) \ - match(construct={dispatch}) +#pragma omp declare variant(f2) \ + append_args(interop(target, prefer_type("cuda")), \ + interop(prefer_type({fr("hsa")}),target)) \ + match(construct={dispatch}) int g2(void) { return 5; } int foo (omp_interop_t obj1) diff --git a/gcc/testsuite/c-c++-common/gomp/append-args-9.c b/gcc/testsuite/c-c++-common/gomp/append-args-9.c index b8586e0..810ab36 100644 --- a/gcc/testsuite/c-c++-common/gomp/append-args-9.c +++ b/gcc/testsuite/c-c++-common/gomp/append-args-9.c @@ -14,14 +14,15 @@ void f1(omp_interop_t *) { } /* { dg-error "argument 1 of 'f1' must be of 'omp_interop_t'" "" { target c } .-1 } */ /* { dg-note "initializing argument 1 of 'void f1\\(omp_interop_t\\*\\)'" "" { target c++ } .-2 } */ #pragma omp declare variant(f1) match(construct={dispatch}) \ - append_args(interop(prefer_type({attr("ompx_fun")}))) + append_args(interop(targetsync, prefer_type({attr("ompx_fun")}))) void g1(void); /* { dg-note "'append_args' specified here" "" { target c } .-2 } */ /* { dg-error "cannot convert 'omp_interop_t' to 'omp_interop_t\\*'" "" { target c++ } .-4 } */ int f2(omp_interop_t); -#pragma omp declare variant(f2) append_args(interop(prefer_type("cuda"))) \ - match(construct={dispatch}) +#pragma omp declare variant(f2) \ + append_args(interop(targetsync, prefer_type("cuda"))) \ + match(construct={dispatch}) int g2(void) { return 5; } int foo (omp_interop_t *obj1) diff --git a/gcc/testsuite/c-c++-common/gomp/interop-1.c b/gcc/testsuite/c-c++-common/gomp/interop-1.c index d68611b..2a81d4b 100644 --- a/gcc/testsuite/c-c++-common/gomp/interop-1.c +++ b/gcc/testsuite/c-c++-common/gomp/interop-1.c @@ -40,12 +40,12 @@ void f() omp_interop_t obj1, obj2, obj3, obj4, obj5; int x; - #pragma omp interop init(obj1) init(target,targetsync : obj2, obj3) nowait // OK - #pragma omp interop init(obj1) init (targetsync : obj2, obj3) nowait // OK - #pragma omp interop init(obj1) init (targetsync , target : obj2, obj3) nowait // OK + #pragma omp interop init(targetsync: obj1) init(target,targetsync : obj2, obj3) nowait // OK + #pragma omp interop init(target: obj1) init (targetsync : obj2, obj3) nowait // OK + #pragma omp interop init(target: obj1) init (targetsync , target : obj2, obj3) nowait // OK - #pragma omp interop init(obj1) init(target,targetsync,target: obj2, obj3) nowait // { dg-error "duplicate 'target' modifier" } - #pragma omp interop init(obj1) init(target,targetsync, targetsync : obj2, obj3) nowait // { dg-error "duplicate 'targetsync' modifier" } + #pragma omp interop init(target: obj1) init(target,targetsync,target: obj2, obj3) nowait // { dg-error "duplicate 'target' modifier" } + #pragma omp interop init(target: obj1) init(target,targetsync, targetsync : obj2, obj3) nowait // { dg-error "duplicate 'targetsync' modifier" } #pragma omp interop init(prefer_type("cuda", omp_ifr_opencl, omp_ifr_level_zero, "hsa"), targetsync : obj1) \ destroy(obj2, obj3) depend(inout: x) use(obj4, obj5) device(device_num: 0) @@ -54,10 +54,10 @@ void f() #pragma omp assume contains(interop) { - #pragma omp interop init(prefer_type("cuða") : obj3) // { dg-warning "unknown foreign runtime identifier 'cu\[^'\]*a'" } + #pragma omp interop init(target, prefer_type("cuða") : obj3) // { dg-warning "unknown foreign runtime identifier 'cu\[^'\]*a'" } } - #pragma omp interop init(prefer_type("cu\0da") : obj3) // { dg-error "string literal must not contain '\\\\0'" } +#pragma omp interop init(target, prefer_type("cu\0da") : obj3) // { dg-error "string literal must not contain '\\\\0'" } #pragma omp interop depend(inout: x) , use(obj2), destroy(obj3) // OK, use or destroy might have 'targetsync' @@ -69,49 +69,47 @@ void f() #pragma omp interop init ( target , prefer_type( { fr("hsa"), attr("ompx_nothing") , fr("hsa" ) }) :obj1) // { dg-error "duplicated 'fr' preference selector before '\\(' token" } - #pragma omp interop init ( prefer_type( 4, omp_ifr_hip*4) : obj1) // { dg-warning "unknown foreign runtime identifier '20'" } - #pragma omp interop init ( prefer_type( __builtin_sin(3.3) : obj1) - // { dg-error "'prefer_type' undeclared \\(first use in this function\\)" "" { target c } .-1 } - // { dg-error "'prefer_type' has not been declared" "" { target c++ } .-2 } - // { dg-error "expected '\\)' before '\\(' token" "" { target *-*-* } .-3 } - - #pragma omp interop init ( prefer_type( __builtin_sin(3.3) ) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } - #pragma omp interop init ( prefer_type( {fr(4 ) }) : obj1) // OK - #pragma omp interop init ( prefer_type( {fr("cu\0da" ) }) : obj1) // { dg-error "string literal must not contain '\\\\0'" } - #pragma omp interop init ( prefer_type( {fr("cuda\0") }) : obj1) // { dg-error "string literal must not contain '\\\\0'" } - #pragma omp interop init ( prefer_type( {fr("cuda" ) }) : obj1) // OK - #pragma omp interop init ( prefer_type( {fr(omp_ifr_level_zero ) }, {fr(omp_ifr_hip)}) : obj1) // OK - #pragma omp interop init ( prefer_type( {fr("cuda", "cuda_driver") }) : obj1) // { dg-error "53: expected '\\)' before ',' token" } - #pragma omp interop init ( prefer_type( {fr(my_string) }) : obj1) // { dg-error "56: expected string literal or constant integer expression before '\\)' token" } - #pragma omp interop init ( prefer_type( {fr("hello" }) : obj1) // { dg-error "expected '\\)' before '\\(' token" } - // { dg-error "'prefer_type' has not been declared" "" { target c++ } .-1 } - #pragma omp interop init ( prefer_type( {fr("hello") }) : obj1) + #pragma omp interop init (target, prefer_type( 4, omp_ifr_hip*4) : obj1) // { dg-warning "unknown foreign runtime identifier '20'" } + #pragma omp interop init (prefer_type( __builtin_sin(3.3), target : obj1) + // { dg-error "expected string literal or constant integer expression" "" { target *-*-* } .-1 } + +#pragma omp interop init (prefer_type( __builtin_sin(3.3)), target : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } + #pragma omp interop init (target, prefer_type( {fr(4 ) }) : obj1) // OK + #pragma omp interop init (target, prefer_type( {fr("cu\0da" ) }) : obj1) // { dg-error "string literal must not contain '\\\\0'" } + #pragma omp interop init (target, prefer_type( {fr("cuda\0") }) : obj1) // { dg-error "string literal must not contain '\\\\0'" } + #pragma omp interop init (target, prefer_type( {fr("cuda" ) }) : obj1) // OK + #pragma omp interop init (target, prefer_type( {fr(omp_ifr_level_zero ) }, {fr(omp_ifr_hip)}) : obj1) // OK + #pragma omp interop init (target, prefer_type( {fr("cuda", "cuda_driver") }) : obj1) // { dg-error "60: expected '\\)' before ',' token" } + #pragma omp interop init (target, prefer_type( {fr(my_string) }) : obj1) // { dg-error "63: expected string literal or constant integer expression before '\\)' token" } + #pragma omp interop init (target, prefer_type( {fr("hello" }) : obj1) // { dg-error "expected '\\)' before '\}' token" } + /* { dg-warning "unknown foreign runtime identifier 'hello' \\\[-Wopenmp\\\]" "" { target *-*-* } .-1 } */ + #pragma omp interop init (target, prefer_type( {fr("hello") }) : obj1) /* { dg-warning "unknown foreign runtime identifier 'hello' \\\[-Wopenmp\\\]" "" { target *-*-* } .-1 } */ - #pragma omp interop init ( prefer_type( {fr(x) }) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } + #pragma omp interop init (target, prefer_type( {fr(x) }) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } - #pragma omp interop init ( prefer_type( {fr(ifr_scalar ) }) : obj1) // OK - #pragma omp interop init ( prefer_type( {fr(ifr_array ) }) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } + #pragma omp interop init (target, prefer_type( {fr(ifr_scalar ) }) : obj1) // OK + #pragma omp interop init (target, prefer_type( {fr(ifr_array ) }) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } // OK in C++, for C: constexpr arrays are not part of C23; however, they are/were under consideration for C2y. - #pragma omp interop init ( prefer_type( {fr(ifr_array[0] ) }) : obj1) + #pragma omp interop init (target, prefer_type( {fr(ifr_array[0] ) }) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" "" { target c } .-1 } - #pragma omp interop init ( prefer_type( omp_ifr_level_zero, omp_ifr_hip ) : obj1) // OK - #pragma omp interop init ( prefer_type( omp_ifr_level_zero +1 ) : obj1) // OK - #pragma omp interop init ( prefer_type( x ) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } + #pragma omp interop init (target, prefer_type( omp_ifr_level_zero, omp_ifr_hip ) : obj1) // OK + #pragma omp interop init (target, prefer_type( omp_ifr_level_zero +1 ) : obj1) // OK + #pragma omp interop init (target, prefer_type( x ) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } - #pragma omp interop init ( prefer_type( ifr_scalar ) : obj1) // OK - #pragma omp interop init ( prefer_type( ifr_array ) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } + #pragma omp interop init (target, prefer_type( ifr_scalar ) : obj1) // OK + #pragma omp interop init (target, prefer_type( ifr_array ) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" } // OK in C++, for C: constexpr arrays are not part of C23; however, they are/were under consideration for C2y. - #pragma omp interop init ( prefer_type( ifr_array[1] ) : obj1) + #pragma omp interop init (target, prefer_type( ifr_array[1] ) : obj1) // { dg-error "expected string literal or constant integer expression before '\\)' token" "" { target c } .-1 } - #pragma omp interop init ( prefer_type( 4, omp_ifr_hip*4) : obj1) // { dg-warning "unknown foreign runtime identifier '20'" } - #pragma omp interop init ( prefer_type( 4, 1, 3) : obj1) + #pragma omp interop init (target, prefer_type( 4, omp_ifr_hip*4) : obj1) // { dg-warning "unknown foreign runtime identifier '20'" } + #pragma omp interop init (target, prefer_type( 4, 1, 3) : obj1) - #pragma omp interop init ( prefer_type( {fr("cuda") }, {fr(omp_ifr_hsa)} , {attr("ompx_a") } , {fr(omp_ifr_hip) }) : obj1) - #pragma omp interop init ( prefer_type( {fr("cuda") }, {fr(omp_ifr_hsa,omp_ifr_level_zero)} , {attr("ompx_a") } , {fr(omp_ifr_hip) }) : obj1) // { dg-error "73: expected '\\)' before ',' token" } - #pragma omp interop init ( prefer_type( {fr("cuda",5) }, {fr(omp_ifr_hsa,omp_ifr_level_zero)} , {attr("ompx_a") } , {fr(omp_ifr_hip) }) : obj1) // { dg-error "53: expected '\\)' before ',' token" } - #pragma omp interop init ( prefer_type( {fr("sycl"), attr("ompx_1", "ompx_2"), attr("ompx_3") }, {attr("ompx_4", "ompx_5"),fr(omp_ifr_level_zero)} ) : obj1) - #pragma omp interop init ( prefer_type( { fr(5), attr("ompx_1") }, {fr(omp_ifr_hsa)} , {attr("ompx_a") } ) : obj1) + #pragma omp interop init (target, prefer_type( {fr("cuda") }, {fr(omp_ifr_hsa)} , {attr("ompx_a") } , {fr(omp_ifr_hip) }) : obj1) + #pragma omp interop init (target, prefer_type( {fr("cuda") }, {fr(omp_ifr_hsa,omp_ifr_level_zero)} , {attr("ompx_a") } , {fr(omp_ifr_hip) }) : obj1) // { dg-error "80: expected '\\)' before ',' token" } + #pragma omp interop init (target, prefer_type( {fr("cuda",5) }, {fr(omp_ifr_hsa,omp_ifr_level_zero)} , {attr("ompx_a") } , {fr(omp_ifr_hip) }) : obj1) // { dg-error "60: expected '\\)' before ',' token" } + #pragma omp interop init (target, prefer_type( {fr("sycl"), attr("ompx_1", "ompx_2"), attr("ompx_3") }, {attr("ompx_4", "ompx_5"),fr(omp_ifr_level_zero)} ) : obj1) + #pragma omp interop init (target, prefer_type( { fr(5), attr("ompx_1") }, {fr(omp_ifr_hsa)} , {attr("ompx_a") } ) : obj1) } diff --git a/gcc/testsuite/c-c++-common/gomp/interop-2.c b/gcc/testsuite/c-c++-common/gomp/interop-2.c index af81cc6..3e6ed81 100644 --- a/gcc/testsuite/c-c++-common/gomp/interop-2.c +++ b/gcc/testsuite/c-c++-common/gomp/interop-2.c @@ -41,18 +41,18 @@ void f(const omp_interop_t ocp) short o2; float of; - #pragma omp interop init (ocp) // { dg-error "'ocp' shall not be const" } - #pragma omp interop init (oce) // { dg-error "'oce' shall not be const" } - #pragma omp interop init (occ) // { dg-error "'occ' shall not be const" } - #pragma omp interop init (od) // { dg-error "'od' must be of 'omp_interop_t'" } - #pragma omp interop init (od[1])// { dg-error "expected '\\)' before '\\\[' token" } + #pragma omp interop init (targetsync: ocp) // { dg-error "'ocp' shall not be const" } + #pragma omp interop init (targetsync: oce) // { dg-error "'oce' shall not be const" } + #pragma omp interop init (targetsync: occ) // { dg-error "'occ' shall not be const" } + #pragma omp interop init (targetsync: od) // { dg-error "'od' must be of 'omp_interop_t'" } + #pragma omp interop init (targetsync: od[1])// { dg-error "expected '\\)' before '\\\[' token" } // { dg-error "'od' must be of 'omp_interop_t'" "" { target *-*-* } .-1 } - #pragma omp interop init (op) // { dg-error "'op' must be of 'omp_interop_t'" } - #pragma omp interop init (*op) + #pragma omp interop init (targetsync: op) // { dg-error "'op' must be of 'omp_interop_t'" } + #pragma omp interop init (targetsync: *op) // { dg-error "expected identifier before '\\*' token" "" { target c } .-1 } // { dg-error "expected unqualified-id before '\\*' token" "" { target c++ } .-2 } - #pragma omp interop init (o2) // { dg-error "'o2' must be of 'omp_interop_t'" } - #pragma omp interop init (of) // { dg-error "'of' must be of 'omp_interop_t'" } + #pragma omp interop init (targetsync: o2) // { dg-error "'o2' must be of 'omp_interop_t'" } + #pragma omp interop init (targetsync: of) // { dg-error "'of' must be of 'omp_interop_t'" } #pragma omp interop use (ocp) // OK #pragma omp interop use (oce) // odd but okay @@ -86,40 +86,26 @@ void g() omp_interop_t obj1, obj2, obj3, obj4, obj5; int x; - #pragma omp interop init ( prefer_type( {fr("") }) : obj1) // { dg-error "non-empty string literal expected before '\\)' token" } - #pragma omp interop init ( prefer_type( {fr("hip") , attr(omp_ifr_cuda) }) : obj1) ! { dg-error "expected string literal before 'omp_ifr_cuda'" } + #pragma omp interop init (target, prefer_type( {fr("") }) : obj1) // { dg-error "non-empty string literal expected before '\\)' token" } + #pragma omp interop init (target, prefer_type( {fr("hip") , attr(omp_ifr_cuda) }) : obj1) ! { dg-error "expected string literal before 'omp_ifr_cuda'" } - #pragma omp interop init ( prefer_type( {fr("hip") , attr("myooption") }) : obj1) // { dg-error "'attr' string literal must start with 'ompx_'" } - #pragma omp interop init ( prefer_type( {fr("hip") , attr("ompx_option") , attr("ompx_") } ) : obj1) - #pragma omp interop init ( prefer_type( {fr("hip") , attr("ompx_option") }, { attr("ompx_") } ) : obj1) - #pragma omp interop init ( prefer_type( {fr("hip") , attr("ompx_option") } { attr("ompx_") } ) : obj1) // { dg-error "expected '\\)' or ',' before '\{' token" } - #pragma omp interop init ( prefer_type( {fr("hip") , attr("ompx_option") ) : obj1) - // { dg-error "expected ',' or '\}' before '\\)' token" "" { target c } .-1 } - // { dg-error "prefer_type' has not been declared" "" { target c++ } .-2 } - // { dg-error "expected '\\)' before '\\(' token" "" { target c++ } .-3 } + #pragma omp interop init (target, prefer_type( {fr("hip") , attr("myooption") }) : obj1) // { dg-error "'attr' string literal must start with 'ompx_'" } + #pragma omp interop init (target, prefer_type( {fr("hip") , attr("ompx_option") , attr("ompx_") } ) : obj1) + #pragma omp interop init (target, prefer_type( {fr("hip") , attr("ompx_option") }, { attr("ompx_") } ) : obj1) + #pragma omp interop init (target, prefer_type( {fr("hip") , attr("ompx_option") } { attr("ompx_") } ) : obj1) // { dg-error "expected '\\)' or ',' before '\{' token" } + #pragma omp interop init (target, prefer_type( {fr("hip") , attr("ompx_option") ) : obj1) // { dg-error "expected ',' or '\}' before '\\)' token" } - #pragma omp interop init ( prefer_type( {fr("hip") attr("ompx_option") ) : obj1) - // { dg-error "expected ',' or '\}' before 'attr'" "" { target c } .-1 } - // { dg-error "prefer_type' has not been declared" "" { target c++ } .-2 } - // { dg-error "expected '\\)' before '\\(' token" "" { target c++ } .-3 } - #pragma omp interop init ( prefer_type( {fr("hip")}), prefer_type("cuda") : obj1) // { dg-error "duplicate 'prefer_type' modifier" } + #pragma omp interop init (target, prefer_type( {fr("hip") attr("ompx_option") ) : obj1) // { dg-error "expected ',' or '\}' before 'attr'" } + #pragma omp interop init (target, prefer_type( {fr("hip")}), prefer_type("cuda") : obj1) // { dg-error "duplicate 'prefer_type' modifier" } - #pragma omp interop init ( prefer_type( {attr("ompx_option1,ompx_option2") } ) : obj1) // { dg-error "'attr' string literal must not contain a comma" } + #pragma omp interop init (target, prefer_type( {attr("ompx_option1,ompx_option2") } ) : obj1) // { dg-error "'attr' string literal must not contain a comma" } - #pragma omp interop init ( prefer_type( {attr("ompx_option1,ompx_option2") ) : obj1) - // { dg-error "'attr' string literal must not contain a comma" "" { target c } .-1 } - // { dg-error "prefer_type' has not been declared" "" { target c++ } .-2 } - // { dg-error "expected '\\)' before '\\(' token" "" { target c++ } .-3 } + #pragma omp interop init (target, prefer_type( {attr("ompx_option1,ompx_option2") ) : obj1) // { dg-error "'attr' string literal must not contain a comma" } #pragma omp interop init ( targetsync other ) : obj1) - // { dg-error "'targetsync' undeclared \\(first use in this function\\)" "" { target c } .-1 } - // { dg-error "'targetsync' has not been declared" "" { target c++ } .-2 } - // { dg-error "expected '\\)' before 'other'" "" { target *-*-* } .-3 } - // { dg-error "expected an OpenMP clause before ':' token" "" { target *-*-* } .-4 } - - #pragma omp interop init ( prefer_type( {fr("cuda") } ), other : obj1) // { dg-error "'init' clause with modifier other than 'prefer_type', 'target' or 'targetsync' before 'other'" } - #pragma omp interop init ( prefer_type( {fr("cuda") } ), obj1) - // { dg-error "'prefer_type' undeclared \\(first use in this function\\)" "" { target c } .-1 } - // { dg-error "'prefer_type' has not been declared" "" { target c++ } .-2 } - // { dg-error "expected '\\)' before '\\(' token" "" { target *-*-* } .-3 } + // { dg-error "expected an OpenMP clause before ':' token" "" { target *-*-* } .-1 } + // { dg-error "expected ':' before 'other'" "" { target *-*-* } .-2 } + + #pragma omp interop init (target, prefer_type( {fr("cuda") } ), other : obj1) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (prefer_type( {fr("cuda") } ), obj1) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } } diff --git a/gcc/testsuite/c-c++-common/gomp/interop-3.c b/gcc/testsuite/c-c++-common/gomp/interop-3.c index 51d26dd..38d7f65 100644 --- a/gcc/testsuite/c-c++-common/gomp/interop-3.c +++ b/gcc/testsuite/c-c++-common/gomp/interop-3.c @@ -34,17 +34,17 @@ void f() omp_interop_t target, targetsync, prefer_type; int x; - #pragma omp interop init(obj1) init(target,targetsync : obj2, obj3) nowait +#pragma omp interop init(target: obj1) init(target,targetsync : obj2, obj3) nowait #pragma omp interop init(prefer_type("cuda", omp_ifr_opencl, omp_ifr_level_zero, "hsa"), targetsync : obj1) \ destroy(obj2, obj3) depend(inout: x) use(obj4, obj5) device(device_num: 0) #pragma omp assume contains(interop) { - #pragma omp interop init(prefer_type("cu da") : obj3) // { dg-warning "unknown foreign runtime identifier 'cu da'" } + #pragma omp interop init(prefer_type("cu da"), targetsync : obj3) // { dg-warning "unknown foreign runtime identifier 'cu da'" } } - #pragma omp interop init(obj1, obj2, obj1), use(obj4) destroy(obj4) + #pragma omp interop init(target: obj1, obj2, obj1), use(obj4) destroy(obj4) // { dg-error "'obj4' appears more than once in action clauses" "" { target *-*-* } .-1 } // { dg-error "'obj1' appears more than once in action clauses" "" { target *-*-* } .-2 } @@ -54,27 +54,21 @@ void f() #pragma omp interop depend(inout: x) use(obj2), destroy(obj3) // Likewise - #pragma omp interop depend(inout: x) use(obj2), destroy(obj3) init(obj4) // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" } + #pragma omp interop depend(inout: x) use(obj2), destroy(obj3) init(target: obj4) // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" } // { dg-note "69: 'init' clause lacks the 'targetsync' modifier" "" { target c } .-1 } - // { dg-note "70: 'init' clause lacks the 'targetsync' modifier" "" { target c++ } .-2 } + // { dg-note "78: 'init' clause lacks the 'targetsync' modifier" "" { target c++ } .-2 } - #pragma omp interop depend(inout: x) init(targetsync : obj5) use(obj2), destroy(obj3) init(obj4) // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" } + #pragma omp interop depend(inout: x) init(targetsync : obj5) use(obj2), destroy(obj3) init(target : obj4) // { dg-error "'depend' clause requires action clauses with 'targetsync' interop-type" } // { dg-note "'init' clause lacks the 'targetsync' modifier" "" { target *-*-* } .-1 } #pragma omp interop depend(inout: x) init(targetsync : obj5) use(obj2), destroy(obj3) init(prefer_type("cuda"), targetsync : obj4) // OK - #pragma omp interop init(target, targetsync, prefer_type, obj1) - #pragma omp interop init(prefer_type, obj1, target, targetsync) + #pragma omp interop init(target, targetsync, prefer_type, obj1) // { dg-error "59: expected '\\(' before ',' token" } + #pragma omp interop init(prefer_type, obj1, target, targetsync) // { dg-error "39: expected '\\(' before ',' token" } // Duplicated variable name or duplicated modifier: #pragma omp interop init(target, targetsync,target : obj1) // { dg-error "duplicate 'target' modifier" } - #pragma omp interop init(target, targetsync,target) // { dg-error "'target' appears more than once in action clauses" } +#pragma omp interop init(target, targetsync,target: obj1) // { dg-error "duplicate 'target' modifier" } #pragma omp interop init(target : target, targetsync,target) // { dg-error "'target' appears more than once in action clauses" } - #pragma omp interop init(target, targetsync,targetsync : obj1) // { dg-error "duplicate 'targetsync' modifier" } - #pragma omp interop init(target, targetsync,targetsync) // { dg-error "targetsync' appears more than once in action clause" } - #pragma omp interop init(target : target, targetsync,targetsync) // { dg-error "targetsync' appears more than once in action clause" } - - #pragma omp interop init(, targetsync, prefer_type, obj1, target) - // { dg-error "expected identifier before ',' token" "" { target c } .-1 } - // { dg-error "expected unqualified-id before ',' token" "" { target c++ } .-2 } + #pragma omp interop init(, targetsync, prefer_type, obj1, target) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } } diff --git a/gcc/testsuite/c-c++-common/gomp/interop-4.c b/gcc/testsuite/c-c++-common/gomp/interop-4.c index bb0bf31..a6449f1 100644 --- a/gcc/testsuite/c-c++-common/gomp/interop-4.c +++ b/gcc/testsuite/c-c++-common/gomp/interop-4.c @@ -33,14 +33,14 @@ f() omp_interop_t obj1, obj2, obj3, obj4, obj5, obj6, obj7; int x[6]; - #pragma omp interop init ( obj1, obj2) use (obj3) destroy(obj4) init(obj5) destroy(obj6) use(obj7) - /* { dg-final { scan-tree-dump-times "#pragma omp interop use\\(obj7\\) destroy\\(obj6\\) init\\(obj5\\) destroy\\(obj4\\) use\\(obj3\\) init\\(obj2\\) init\\(obj1\\)\[\r\n\]" 1 "original" } } */ +#pragma omp interop init (target: obj1, obj2) use (obj3) destroy(obj4) init(targetsync: obj5) destroy(obj6) use(obj7) + /* { dg-final { scan-tree-dump-times "#pragma omp interop use\\(obj7\\) destroy\\(obj6\\) init\\(targetsync: obj5\\) destroy\\(obj4\\) use\\(obj3\\) init\\(target: obj2\\) init\\(target: obj1\\)\[\r\n\]" 1 "original" } } */ #pragma omp interop nowait init (targetsync : obj1, obj2) use (obj3) destroy(obj4) init(target, targetsync : obj5) destroy(obj6) use(obj7) depend(inout: x) /* { dg-final { scan-tree-dump-times "#pragma omp interop depend\\(inout:x\\) use\\(obj7\\) destroy\\(obj6\\) init\\(target, targetsync: obj5\\) destroy\\(obj4\\) use\\(obj3\\) init\\(targetsync: obj2\\) init\\(targetsync: obj1\\) nowait\[\r\n\]" 1 "original" } } */ - #pragma omp interop init ( obj1, obj2) init (target: obj3) init(targetsync : obj4) init(target,targetsync: obj5) - /* { dg-final { scan-tree-dump-times "#pragma omp interop init\\(target, targetsync: obj5\\) init\\(targetsync: obj4\\) init\\(target: obj3\\) init\\(obj2\\) init\\(obj1\\)\[\r\n\]" 1 "original" } } */ +#pragma omp interop init (target: obj1, obj2) init (target: obj3) init(targetsync : obj4) init(target,targetsync: obj5) + /* { dg-final { scan-tree-dump-times "#pragma omp interop init\\(target, targetsync: obj5\\) init\\(targetsync: obj4\\) init\\(target: obj3\\) init\\(target: obj2\\) init\\(target: obj1\\)\[\r\n\]" 1 "original" } } */ /* -------------------------------------------- */ diff --git a/gcc/testsuite/c-c++-common/gomp/pr118965-1.c b/gcc/testsuite/c-c++-common/gomp/pr118965-1.c new file mode 100644 index 0000000..2014b94 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr118965-1.c @@ -0,0 +1,57 @@ +/* { dg-do compile } */ + +/* At least one of the target and/or targetsync modifiers must be provided. + This implies that there are always modifiers required, and the parser + should reject e.g. "init (var1, var2)"; the first thing in the list is + always an init_modifier in valid code. */ + +/* The following definitions are in omp_lib, which cannot be included + in gcc/testsuite/ */ + +#if __cplusplus >= 201103L +# define __GOMP_UINTPTR_T_ENUM : __UINTPTR_TYPE__ +#else +# define __GOMP_UINTPTR_T_ENUM +#endif + +typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM +{ + omp_interop_none = 0, + __omp_interop_t_max__ = __UINTPTR_MAX__ +} omp_interop_t; + +typedef enum omp_interop_fr_t +{ + omp_ifr_cuda = 1, + omp_ifr_cuda_driver = 2, + omp_ifr_opencl = 3, + omp_ifr_sycl = 4, + omp_ifr_hip = 5, + omp_ifr_level_zero = 6, + omp_ifr_hsa = 7, + omp_ifr_last = omp_ifr_hsa +} omp_interop_fr_t; + +// --------------------------------- + +void f() +{ + omp_interop_t obj1, obj2; + + #pragma omp interop init (obj1) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (obj1, obj2) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (obj1, target) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (target, obj1) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (obj1, targetsync) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (targetsync, obj1) // { dg-error "expected 'prefer_type', 'target', or 'targetsync'" } + #pragma omp interop init (targetsync, target) // { dg-error "expected ':' before '\\)' token" } + + #pragma omp interop init (target, prefer_type( {fr(4 ) }) : obj1) // OK + #pragma omp interop init (targetsync, prefer_type( {fr(4 ) }) : obj1) // OK + #pragma omp interop init (prefer_type( {fr(4 ) }), target : obj1) // OK + + #pragma omp interop init (prefer_type( {fr(4 ) }) : obj1) // { dg-error "missing required 'target' and/or 'targetsync' modifier" } + #pragma omp interop init (prefer_type( {fr(4 ) }) : foobar) // { dg-error "missing required 'target' and/or 'targetsync' modifier" } + // { dg-error "'foobar' undeclared" "" { target c } .-1 } + // { dg-error "'foobar' has not been declared" "" { target c++ } .-2 } +} diff --git a/gcc/testsuite/c-c++-common/gomp/pr118965-2.c b/gcc/testsuite/c-c++-common/gomp/pr118965-2.c new file mode 100644 index 0000000..6e27179 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr118965-2.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ + +/* At least one of the target and/or targetsync modifiers must be provided. */ + +#if __cplusplus >= 201103L +# define __GOMP_UINTPTR_T_ENUM : __UINTPTR_TYPE__ +#else +# define __GOMP_UINTPTR_T_ENUM +#endif + +typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM +{ + omp_interop_none = 0, + __omp_interop_t_max__ = __UINTPTR_MAX__ +} omp_interop_t; + +void f1(omp_interop_t) { } +#pragma omp declare variant(f1) match(construct={dispatch}) \ + append_args(interop(prefer_type({attr("ompx_fun")}))) +// { dg-error "missing required 'target' and/or 'targetsync' modifier" "" { target *-*-* } .-1 } +void g1(void); + + +int f2(omp_interop_t, omp_interop_t); +#pragma omp declare variant(f2) \ + append_args(interop(prefer_type("cuda")), \ + interop(prefer_type({fr("hsa")}))) \ + match(construct={dispatch}) +// { dg-error "missing required 'target' and/or 'targetsync' modifier" "" { target *-*-* } .-3 } +// { dg-error "missing required 'target' and/or 'targetsync' modifier" "" { target *-*-* } .-3 } +int g2(void) { return 5; } |