summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-01-23 14:32:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-01-23 14:32:19 +0100
commit652fea39227eeead0e9876097cacc6bf727b39a6 (patch)
tree9505605dd378270b29575a896d9fbad7e53955f0
parent7fd841e250f6b82ee566a4d74d9c9306c6aa37f6 (diff)
downloadgcc-652fea39227eeead0e9876097cacc6bf727b39a6.tar.gz
re PR middle-end/58809 (ICE with complex variable in OpenMP reduction clause)
PR middle-end/58809 * c-typeck.c (c_finish_omp_clause): Reject MIN_EXPR, MAX_EXPR, BIT_AND_EXPR, BIT_IOR_EXPR and BIT_XOR_EXPR on COMPLEX_TYPEs. * semantics.c (finish_omp_reduction_clause): Reject BIT_AND_EXPR, BIT_IOR_EXPR and BIT_XOR_EXPR on COMPLEX_TYPEs. * c-c++-common/gomp/pr58809.c: New test. From-SVN: r206962
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-typeck.c15
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr58809.c31
6 files changed, 64 insertions, 3 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 3ec4fe7de16..dca35d4c7ea 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/58809
+ * c-typeck.c (c_finish_omp_clause): Reject MIN_EXPR, MAX_EXPR,
+ BIT_AND_EXPR, BIT_IOR_EXPR and BIT_XOR_EXPR on COMPLEX_TYPEs.
+
2014-01-22 Marek Polacek <polacek@redhat.com>
PR c/59891
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 7cb717a9749..92304b0db9e 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -11713,7 +11713,8 @@ c_finish_omp_clauses (tree clauses)
need_implicitly_determined = true;
t = OMP_CLAUSE_DECL (c);
if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) == NULL_TREE
- && FLOAT_TYPE_P (TREE_TYPE (t)))
+ && (FLOAT_TYPE_P (TREE_TYPE (t))
+ || TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE))
{
enum tree_code r_code = OMP_CLAUSE_REDUCTION_CODE (c);
const char *r_name = NULL;
@@ -11723,8 +11724,14 @@ c_finish_omp_clauses (tree clauses)
case PLUS_EXPR:
case MULT_EXPR:
case MINUS_EXPR:
+ break;
case MIN_EXPR:
+ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE)
+ r_name = "min";
+ break;
case MAX_EXPR:
+ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE)
+ r_name = "max";
break;
case BIT_AND_EXPR:
r_name = "&";
@@ -11736,10 +11743,12 @@ c_finish_omp_clauses (tree clauses)
r_name = "|";
break;
case TRUTH_ANDIF_EXPR:
- r_name = "&&";
+ if (FLOAT_TYPE_P (TREE_TYPE (t)))
+ r_name = "&&";
break;
case TRUTH_ORIF_EXPR:
- r_name = "||";
+ if (FLOAT_TYPE_P (TREE_TYPE (t)))
+ r_name = "||";
break;
default:
gcc_unreachable ();
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 671b36cc193..a16eb66a322 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/58809
+ * semantics.c (finish_omp_reduction_clause): Reject
+ BIT_AND_EXPR, BIT_IOR_EXPR and BIT_XOR_EXPR on COMPLEX_TYPEs.
+
2014-01-22 Ville Voutilainen <ville.voutilainen@gmail.com>
PR c++/59482
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index eb04266aee8..bba00f4839a 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4971,6 +4971,10 @@ finish_omp_reduction_clause (tree c, bool *need_default_ctor, bool *need_dtor)
case BIT_AND_EXPR:
case BIT_IOR_EXPR:
case BIT_XOR_EXPR:
+ if (FLOAT_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE)
+ break;
+ predefined = true;
+ break;
case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR:
if (FLOAT_TYPE_P (type))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bf9f01dd814..2180cb81980 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/58809
+ * c-c++-common/gomp/pr58809.c: New test.
+
2014-01-23 Dominique Dhumieres <dominiq@lps.ens.fr>
PR sanitizer/59897
diff --git a/gcc/testsuite/c-c++-common/gomp/pr58809.c b/gcc/testsuite/c-c++-common/gomp/pr58809.c
new file mode 100644
index 00000000000..f4fd7c4834d
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pr58809.c
@@ -0,0 +1,31 @@
+/* PR middle-end/58809 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+_Complex int j;
+_Complex double d;
+
+void
+foo (void)
+{
+ #pragma omp parallel reduction (&:j) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (|:j) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (^:j) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (min:j) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (max:j) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (&:d) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (|:d) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (^:d) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (min:d) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+ #pragma omp parallel reduction (max:d) /* { dg-error "has invalid type for|user defined reduction not found for" } */
+ ;
+}