diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/gomp')
20 files changed, 501 insertions, 14 deletions
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c index 4196b2d1521..f2c4a672fe4 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c @@ -15,7 +15,7 @@ wrong1 (int n) for (i = 0; i < n; i++) { /* incorrect nesting of loop regions */ -#pragma omp for /* { dg-warning "may not be closely nested" } */ +#pragma omp for /* { dg-error "may not be closely nested" } */ for (j = 0; j < n; j++) work (i, j); } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c index 31b2ddf0367..64005b3074b 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c @@ -12,7 +12,7 @@ wrong3 (int n) for (i = 0; i < n; i++) { /* incorrect nesting of regions */ -#pragma omp single /* { dg-warning "may not be closely nested" } */ +#pragma omp single /* { dg-error "may not be closely nested" } */ work (i, 0); } } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c index d7579e6e735..5bb6b80b396 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.4.c @@ -11,7 +11,7 @@ wrong4 (int n) { work (i, 0); /* incorrect nesting of barrier region in a loop region */ -#pragma omp barrier /* { dg-warning "may not be closely nested" } */ +#pragma omp barrier /* { dg-error "may not be closely nested" } */ work (i, 1); } } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c index 7b53015571e..7b4aee1c06b 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.5.c @@ -9,7 +9,7 @@ wrong5 (int n) { work (n, 0); /* incorrect nesting of barrier region in a critical region */ -#pragma omp barrier +#pragma omp barrier /* { dg-error "may not be closely nested" } */ work (n, 1); } } diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c index ac850e5410a..d18188b1752 100644 --- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c +++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.6.c @@ -9,7 +9,7 @@ wrong6 (int n) { work (n, 0); /* incorrect nesting of barrier region in a single region */ -#pragma omp barrier /* { dg-warning "may not be closely nested" } */ +#pragma omp barrier /* { dg-error "may not be closely nested" } */ work (n, 1); } } diff --git a/gcc/testsuite/gcc.dg/gomp/block-3.c b/gcc/testsuite/gcc.dg/gomp/block-3.c index c72b04c35d0..b4530e9d06c 100644 --- a/gcc/testsuite/gcc.dg/gomp/block-3.c +++ b/gcc/testsuite/gcc.dg/gomp/block-3.c @@ -35,9 +35,10 @@ void foo() #pragma omp sections { - goto ok1; - ok1:; - + { + goto ok1; + ok1:; + } #pragma omp section for (i = 0; i < 10; ++i) if (test(i)) diff --git a/gcc/testsuite/gcc.dg/gomp/clause-1.c b/gcc/testsuite/gcc.dg/gomp/clause-1.c index ba189896c62..fc7d72b7cd2 100644 --- a/gcc/testsuite/gcc.dg/gomp/clause-1.c +++ b/gcc/testsuite/gcc.dg/gomp/clause-1.c @@ -11,7 +11,7 @@ int t; void foo (int x) { - char *p; + char *pp; struct S { int i; int j; } s; char a[32]; double d; @@ -42,11 +42,11 @@ foo (int x) ; #pragma omp p firstprivate (bar) /* { dg-error "is not a variable" } */ ; -#pragma omp p reduction (+:p) /* { dg-error "has invalid type for" } */ +#pragma omp p reduction (+:pp) /* { dg-error "user defined reduction not found for" } */ ; -#pragma omp p reduction (*:s) /* { dg-error "has invalid type for" } */ +#pragma omp p reduction (*:s) /* { dg-error "user defined reduction not found for" } */ ; -#pragma omp p reduction (-:a) /* { dg-error "has invalid type for" } */ +#pragma omp p reduction (-:a) /* { dg-error "user defined reduction not found for" } */ ; d = 0; #pragma omp p reduction (*:d) diff --git a/gcc/testsuite/gcc.dg/gomp/combined-1.c b/gcc/testsuite/gcc.dg/gomp/combined-1.c index dfed647371f..7e23c3256cb 100644 --- a/gcc/testsuite/gcc.dg/gomp/combined-1.c +++ b/gcc/testsuite/gcc.dg/gomp/combined-1.c @@ -20,5 +20,5 @@ int foo (void) } } -/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_runtime_start" 3 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_parallel_loop_runtime" 3 "optimized" } } */ /* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/gomp/declare-simd-1.c b/gcc/testsuite/gcc.dg/gomp/declare-simd-1.c new file mode 100644 index 00000000000..259e2c0ae92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/declare-simd-1.c @@ -0,0 +1,100 @@ +/* Test parsing of #pragma omp declare simd */ +/* { dg-do compile } */ + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) \ + linear (c : 4) simdlen (8) notinbranch +#pragma omp declare simd uniform (c) aligned (b : 4 * sizeof (int)) linear (a \ + : 4) simdlen (4) inbranch +int f1 (int a, int *b, int c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int f2 (int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (long long)) linear (c : 4) simdlen (8) +__extension__ +long long f3 (long long a, long long *b, long long c); + +int +f4 (int x) +{ + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + __extension__ __extension__ __extension__ + extern int f5 (int a, int *b, int c); + { + x++; + #pragma omp declare simd simdlen (4) linear (c) + extern int f6 (int a, int *b, int c); + } + return x; +} + +#pragma omp declare simd simdlen (16) +int +f7 (int x) +{ + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f8 (int a, int *b, int c); + return x; +} + +int +f9 (int x) +{ + if (x) + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f10 (int a, int *b, int c); + while (x < 10) + #pragma omp declare simd simdlen (8) aligned (b : 8 * sizeof (int)) + extern int f11 (int a, int *b, int c); + return x; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int f12 (int c; int *b; int a; int a, int *b, int c); + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int +f13 (int c; int *b; int a; int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int +f14 (a, b, c) + int a, c; + int *b; +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (a) aligned (b : 8 * sizeof (int)) linear (c : 4) simdlen (8) +int +f15 (int a, int *b, int c) +{ + return a + *b + c; +} + +#pragma omp declare simd uniform (d) aligned (e : 8 * sizeof (int)) linear (f : 4) simdlen (8) +int f15 (int d, int *e, int f); + +#pragma omp declare simd aligned (g : sizeof (*g)) linear (h : 2 * sizeof (g[0]) + sizeof (h)) simdlen (4) +int f16 (long *g, int h); + +#pragma omp declare simd aligned (h : sizeof (*h)) linear (g : 2 * sizeof (h[0]) + sizeof (g)) simdlen (4) +int f17 (int g, long *h) +{ + return g + h[0]; +} + +#pragma omp declare simd aligned (i : sizeof (*i)) linear (j : 2 * sizeof (i[0]) + sizeof (j)) simdlen (4) +int +f18 (j, i) + long *i; + int j; +{ + return j + i[0]; +} diff --git a/gcc/testsuite/gcc.dg/gomp/declare-simd-2.c b/gcc/testsuite/gcc.dg/gomp/declare-simd-2.c new file mode 100644 index 00000000000..118549be908 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/declare-simd-2.c @@ -0,0 +1,24 @@ +/* Test parsing of #pragma omp declare simd */ +/* { dg-do compile } */ + +#pragma omp declare simd +int a; /* { dg-error "not immediately followed by a function declaration or definition" } */ + +#pragma omp declare simd +int fn1 (int a), fn2 (int a); /* { dg-error "not immediately followed by a single function declaration or definition" } */ + +#pragma omp declare simd +int b, fn3 (int a); /* { dg-error "not immediately followed by a function declaration or definition" } */ + +#pragma omp declare simd linear (a) +int fn4 (int a), c; /* { dg-error "not immediately followed by a function declaration or definition" } */ + +int t; + +#pragma omp declare simd +#pragma omp declare simd +#pragma omp threadprivate(t) /* { dg-error "must be followed by function declaration or definition or another" } */ +int fn5 (int a); + +#pragma omp declare simd inbranch notinbranch /* { dg-error "clause is incompatible with" } */ +int fn6 (int); diff --git a/gcc/testsuite/gcc.dg/gomp/gomp.exp b/gcc/testsuite/gcc.dg/gomp/gomp.exp index ca8aefd3c4e..cc2cd8ed089 100644 --- a/gcc/testsuite/gcc.dg/gomp/gomp.exp +++ b/gcc/testsuite/gcc.dg/gomp/gomp.exp @@ -29,7 +29,9 @@ if ![check_effective_target_fopenmp] { dg-init # Main loop. -dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c $srcdir/c-c++-common/gomp/*.c]] "" "-fopenmp" +dg-runtest [lsort [concat \ + [find $srcdir/$subdir *.c] \ + [find $srcdir/c-c++-common/gomp *.c]]] "" "-fopenmp" # All done. dg-finish diff --git a/gcc/testsuite/gcc.dg/gomp/nesting-1.c b/gcc/testsuite/gcc.dg/gomp/nesting-1.c index df57ac845f7..52fcda741ea 100644 --- a/gcc/testsuite/gcc.dg/gomp/nesting-1.c +++ b/gcc/testsuite/gcc.dg/gomp/nesting-1.c @@ -28,17 +28,58 @@ f1 (void) #pragma omp for /* { dg-error "may not be closely nested" } */ for (j = 0; j < 3; j++) ; + } + #pragma omp sections + { #pragma omp sections /* { dg-error "may not be closely nested" } */ { ; #pragma omp section ; } + } + #pragma omp sections + { #pragma omp single /* { dg-error "may not be closely nested" } */ ; + } + #pragma omp sections + { #pragma omp master /* { dg-error "may not be closely nested" } */ ; + } + #pragma omp sections + { + #pragma omp section + ; + } + #pragma omp sections + { #pragma omp section + #pragma omp for /* { dg-error "may not be closely nested" } */ + for (j = 0; j < 3; j++) + ; + } + #pragma omp sections + { + #pragma omp section + #pragma omp sections /* { dg-error "may not be closely nested" } */ + { + ; + #pragma omp section + ; + } + } + #pragma omp sections + { + #pragma omp section + #pragma omp single /* { dg-error "may not be closely nested" } */ + ; + } + #pragma omp sections + { + #pragma omp section + #pragma omp master /* { dg-error "may not be closely nested" } */ ; } #pragma omp single diff --git a/gcc/testsuite/gcc.dg/gomp/target-1.c b/gcc/testsuite/gcc.dg/gomp/target-1.c new file mode 100644 index 00000000000..09e65bd3115 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/target-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +void +foo (int x) +{ + bad1: + #pragma omp target + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target + { + bad2: ; + } + + #pragma omp target + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/target-2.c b/gcc/testsuite/gcc.dg/gomp/target-2.c new file mode 100644 index 00000000000..546a1d0c157 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/target-2.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +void +foo (int x, int y) +{ + bad1: + #pragma omp target data map(tofrom: y) + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target data map(tofrom: y) + { + bad2: ; + } + + #pragma omp target data map(tofrom: y) + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target data map(tofrom: y) + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/taskgroup-1.c b/gcc/testsuite/gcc.dg/gomp/taskgroup-1.c new file mode 100644 index 00000000000..e301efc19c4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/taskgroup-1.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +void +foo (int x) +{ + bad1: + #pragma omp taskgroup + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp taskgroup + { + bad2: ; + } + + #pragma omp taskgroup + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp taskgroup + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/teams-1.c b/gcc/testsuite/gcc.dg/gomp/teams-1.c new file mode 100644 index 00000000000..73c00ded78b --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/teams-1.c @@ -0,0 +1,61 @@ +/* { dg-do compile } */ + +void +foo (int x) +{ + bad1: + #pragma omp target teams + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target teams + { + bad2: ; + } + + #pragma omp target teams + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target teams + { case 0:; } + } +} + +void +bar (int x) +{ + bad1: + #pragma omp target + #pragma omp teams + goto bad1; /* { dg-error "invalid branch" } */ + + goto bad2; /* { dg-error "invalid entry" } */ + #pragma omp target + #pragma omp teams + { + bad2: ; + } + + #pragma omp target + #pragma omp teams + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } + + switch (x) /* { dg-error "invalid entry" } */ + { + #pragma omp target + #pragma omp teams + { case 0:; } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-1.c b/gcc/testsuite/gcc.dg/gomp/udr-1.c new file mode 100644 index 00000000000..4948a984f69 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-1.c @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +#pragma omp declare reduction (| : long int : omp_out |= omp_in) /* { dg-error "predeclared arithmetic type" } */ +#pragma omp declare reduction (+ : char : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ +typedef short T; +#pragma omp declare reduction (min : T : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ +#pragma omp declare reduction (* : _Complex double : omp_out *= omp_in) /* { dg-error "predeclared arithmetic type" } */ + +void +foo (void) +{ + #pragma omp declare reduction (| : long int : omp_out |= omp_in) /* { dg-error "predeclared arithmetic type" } */ + #pragma omp declare reduction (+ : char : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ + #pragma omp declare reduction (min : T : omp_out += omp_in) /* { dg-error "predeclared arithmetic type" } */ + #pragma omp declare reduction (* : _Complex double : omp_out *= omp_in) /* { dg-error "predeclared arithmetic type" } */ +} + +#pragma omp declare reduction (| : __typeof (foo) : omp_out |= omp_in) /* { dg-error "function or array" } */ +#pragma omp declare reduction (+ : char () : omp_out += omp_in) /* { dg-error "function or array" } */ +#pragma omp declare reduction (min : T[2] : omp_out += omp_in) /* { dg-error "function or array" } */ + +void +bar (void) +{ + #pragma omp declare reduction (| : __typeof (foo) : omp_out |= omp_in)/* { dg-error "function or array" } */ + #pragma omp declare reduction (+ : char () : omp_out += omp_in) /* { dg-error "function or array" } */ + #pragma omp declare reduction (min : T[2] : omp_out += omp_in) /* { dg-error "function or array" } */ +} + +struct A { int a; }; +#pragma omp declare reduction (| : const struct A : omp_out.a |= omp_in.a) /* { dg-error "const, volatile or restrict" } */ +#pragma omp declare reduction (+ : __const struct A : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ +typedef volatile struct A T2; +#pragma omp declare reduction (min : T2 : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ +#pragma omp declare reduction (* : struct A *__restrict : omp_out->a *= omp_in->a)/* { dg-error "const, volatile or restrict" } */ + +void +baz (void) +{ + #pragma omp declare reduction (| : const struct A : omp_out.a |= omp_in.a) /* { dg-error "const, volatile or restrict" } */ + #pragma omp declare reduction (+ : __const struct A : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ + typedef volatile struct A T3; + #pragma omp declare reduction (min : T3 : omp_out.a += omp_in.a) /* { dg-error "const, volatile or restrict" } */ + #pragma omp declare reduction (* : struct A *__restrict : omp_out->a *= omp_in->a)/* { dg-error "const, volatile or restrict" } */ +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-2.c b/gcc/testsuite/gcc.dg/gomp/udr-2.c new file mode 100644 index 00000000000..87992d7c6ed --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-2.c @@ -0,0 +1,42 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct W { int w; }; +void init (struct W *, int, int *); +int v; +#pragma omp declare reduction (foo : long int : omp_out |= v) /* { dg-error "combiner refers to variable" } */ +#pragma omp declare reduction (foo : char : omp_out = v) /* { dg-error "combiner refers to variable" } */ +typedef short T; +#pragma omp declare reduction (foo : T : omp_out += v) /* { dg-error "combiner refers to variable" } */ +#pragma omp declare reduction (foo : int : v *= omp_in) /* { dg-error "combiner refers to variable" } */ +#pragma omp declare reduction (foo : struct W : omp_out.w *= omp_in.w + v) /* { dg-error "combiner refers to variable" } */ + +void +foo (int v) +{ + #pragma omp declare reduction (foo : long int : omp_out |= v) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : char : omp_out = v) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : T : omp_out += v) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : int : v *= omp_in) /* { dg-error "combiner refers to variable" } */ + #pragma omp declare reduction (foo : struct W : omp_out.w *= omp_in.w + v) /* { dg-error "combiner refers to variable" } */ +} + +#pragma omp declare reduction (bar : long int : omp_out |= omp_in) initializer (omp_priv = v) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : char : omp_out += omp_in) initializer (omp_priv = ((char) v)) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : T : omp_out += omp_in) initializer (omp_priv = (short) v) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : _Complex double : omp_out *= omp_in) initializer (omp_priv = (v)) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar : struct W : omp_out.w *= omp_in.w) initializer (omp_priv = { v } ) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar2 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, v, (int *) 0)) /* { dg-error "initializer refers to variable" } */ +#pragma omp declare reduction (bar3 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, 0, &v)) /* { dg-error "initializer refers to variable" } */ + +void +bar (int v) +{ + #pragma omp declare reduction (bar : long int : omp_out |= omp_in) initializer (omp_priv = v) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : char : omp_out += omp_in) initializer (omp_priv = ((char) v)) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : T : omp_out += omp_in) initializer (omp_priv = (short) v) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : _Complex double : omp_out *= omp_in) initializer (omp_priv = (v)) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar : struct W : omp_out.w *= omp_in.w) initializer (omp_priv = { v }) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar2 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, v, (int *) 0)) /* { dg-error "initializer refers to variable" } */ + #pragma omp declare reduction (bar3 : struct W : omp_out.w *= omp_in.w) initializer (init (&omp_priv, 0, &v)) /* { dg-error "initializer refers to variable" } */ +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-3.c b/gcc/testsuite/gcc.dg/gomp/udr-3.c new file mode 100644 index 00000000000..bdfcce1d0b6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-3.c @@ -0,0 +1,77 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +struct S { int s; }; +struct T { int t; }; +struct U { int u; }; + +#pragma omp declare reduction (+: struct S: omp_out.s += omp_in.s) +#pragma omp declare reduction (*: struct S: omp_out.s *= omp_in.s) \ + initializer (omp_priv = {1}) +#pragma omp declare reduction (foo: struct S: omp_out.s += omp_in.s) + +void +f1 () +{ + struct S s, s2; + struct T t; + #pragma omp declare reduction (+: struct T: omp_out.t += omp_in.t) + #pragma omp parallel reduction (+: t) reduction (foo: s) reduction (*: s2) + s.s = 1, t.t = 1, s2.s = 2; + #pragma omp parallel reduction (+: s) + s.s = 1; +} + +void bar (struct S *); + +void +f2 () +{ + #pragma omp declare reduction (foo: struct S: omp_out.s += omp_in.s) initializer (bar (&omp_priv)) + #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s) initializer (bar (&omp_orig)) /* { dg-error "one of the initializer call arguments should be" } */ +} + +#pragma omp declare reduction (+: struct U: omp_out.u *= omp_in.u) /* { dg-error "previous" } */ +#pragma omp declare reduction (+: struct U: omp_out.u += omp_in.u) /* { dg-error "redeclaration of" } */ + +void +f3 () +{ + #pragma omp declare reduction (f3: struct U: omp_out.u *= omp_in.u) /* { dg-error "previous" } */ + #pragma omp declare reduction (f3: struct U: omp_out.u += omp_in.u) /* { dg-error "redeclaration of" } */ +} + +struct V +{ + #pragma omp declare reduction (bar: struct S: omp_out.s *= omp_in.s) /* { dg-error "not at file or block scope" } */ + #pragma omp declare reduction (bar: struct S: omp_out.s += omp_in.s) /* { dg-error "not at file or block scope" } */ +}; + +#pragma omp declare reduction (n3: long: omp_out += omp_in) /* { dg-error "previous" } */ +#pragma omp declare reduction (n3: long int: omp_out += omp_in) /* { dg-error "redeclaration of" } */ +#pragma omp declare reduction (n3: short unsigned: omp_out += omp_in) +#pragma omp declare reduction (n3: short int: omp_out += omp_in) + +void +f4 (void) +{ + #pragma omp declare reduction (f4: long: omp_out += omp_in) /* { dg-error "previous" } */ + #pragma omp declare reduction (f4: long int: omp_out += omp_in) /* { dg-error "redeclaration of" } */ + #pragma omp declare reduction (f4: short unsigned: omp_out += omp_in) + #pragma omp declare reduction (f4: short int: omp_out += omp_in) +} + +void +f5 (void) +{ + #pragma omp declare reduction (+: struct S: omp_out.s += omp_in.s) initializer (omp_priv) /* { dg-error "expected" } */ + #pragma omp declare reduction (+: struct T: omp_out.t += omp_in.t) initializer (omp_priv ()) /* { dg-error "expected" } */ +} + +void +f6 (a, b) +#pragma omp declare reduction (bar: struct S: omp_out.s *= omp_in.s) /* { dg-error "expected declaration specifiers before" } */ + int a; + int b; +{ +} diff --git a/gcc/testsuite/gcc.dg/gomp/udr-4.c b/gcc/testsuite/gcc.dg/gomp/udr-4.c new file mode 100644 index 00000000000..3758f91e851 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/udr-4.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +struct S; +#pragma omp declare reduction (+:struct S:omp_out.s += omp_in.s) /* { dg-error "invalid use of undefined type" } */ +struct S { int s; }; +#pragma omp declare reduction (*:struct S:omp_out.s *= omp_in.s) |