diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-02-04 22:32:36 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2015-02-04 22:32:36 +0000 |
commit | 04b562e1cfa4e09cee7f9fac39c6d7072d8aea3f (patch) | |
tree | 02931ee5cccee35af26dbaf8156acf44d9ec6fb5 /libgomp/testsuite/libgomp.c | |
parent | 7120530055d3dc900d5cd32069788b75bd5a40be (diff) |
PR c/64824
PR c/64868
gcc/c/
* c-parser.c (c_parser_omp_atomic): Handle RDIV_EXPR.
gcc/cp/
* parser.c (cp_parser_omp_atomic): Handle RDIV_EXPR.
gcc/c-family/
* c-omp.c (c_finish_omp_atomic): Use TRUNC_DIV_EXPR
instead of RDIV_EXPR. Use build_binary_op instead of
build2_loc.
libgomp/
* testsuite/libgomp.c/pr64824.c: New test.
* testsuite/libgomp.c/pr64868.c: New test.
* testsuite/libgomp.c++/pr64824.C: New test.
* testsuite/libgomp.c++/pr64868.C: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@220420 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgomp/testsuite/libgomp.c')
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr64824.c | 16 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c/pr64868.c | 87 |
2 files changed, 103 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c/pr64824.c b/libgomp/testsuite/libgomp.c/pr64824.c new file mode 100644 index 00000000000..544d0b0fc1f --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr64824.c @@ -0,0 +1,16 @@ +/* PR c/64824 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fopenmp" } */ + +int +main () +{ + long long a; + long long b = 1LL; + int c = 3; +#pragma omp atomic capture + a = b = c << b; + if (b != 6LL || a != 6LL) + __builtin_abort (); + return 0; +} diff --git a/libgomp/testsuite/libgomp.c/pr64868.c b/libgomp/testsuite/libgomp.c/pr64868.c new file mode 100644 index 00000000000..acdf9984108 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/pr64868.c @@ -0,0 +1,87 @@ +/* PR c/64868 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fopenmp" } */ + +float f = 2.0f; +double d = 4.0; +long double ld = 8.0L; + +void +foo () +{ +#pragma omp atomic + f = 1.0f / f; +#pragma omp atomic + f = 1 / f; +#pragma omp atomic + f = f / 2.0f; +#pragma omp atomic + f = f / 2; +#pragma omp atomic + f /= 2.0f; +#pragma omp atomic + f /= 2; +#pragma omp atomic + d = 1.0 / d; +#pragma omp atomic + d = 1 / d; +#pragma omp atomic + d = d / 2.0; +#pragma omp atomic + d = d / 2; +#pragma omp atomic + d /= 2.0; +#pragma omp atomic + d /= 2; +#pragma omp atomic + ld = 1.0L / ld; +#pragma omp atomic + ld = 1 / ld; +#pragma omp atomic + ld = ld / 2.0L; +#pragma omp atomic + ld = ld / 2; +#pragma omp atomic + ld /= 2.0L; +#pragma omp atomic + ld /= 2; + if (f != 0.125f || d != 0.25 || ld != 0.5L) + __builtin_abort (); +} + +#ifdef __cplusplus +template <typename T, int N1, int N2> +void +bar () +{ + T v = ::d; +#pragma omp atomic + v *= 16; +#pragma omp atomic + v = 1.0 / v; +#pragma omp atomic + v = N1 / v; +#pragma omp atomic + v = v / 2.0; +#pragma omp atomic + v = v / N2; +#pragma omp atomic + v /= 2.0; +#pragma omp atomic + v /= N2; + if (v != 0.25) + __builtin_abort (); +} +#endif + +int +main () +{ + foo (); +#ifdef __cplusplus + bar<float, 1, 2> (); + bar<double, 1, 2> (); + bar<long double, 1, 2> (); +#endif + return 0; +} |