diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-01-23 14:32:19 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-01-23 14:32:19 +0100 |
commit | 652fea39227eeead0e9876097cacc6bf727b39a6 (patch) | |
tree | 9505605dd378270b29575a896d9fbad7e53955f0 /gcc/c | |
parent | 7fd841e250f6b82ee566a4d74d9c9306c6aa37f6 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-typeck.c | 15 |
2 files changed, 18 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 (); |