From: Jakub Jelinek Date: Thu, 23 Jan 2014 13:32:19 +0000 (+0100) Subject: re PR middle-end/58809 (ICE with complex variable in OpenMP reduction clause) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=652fea39227eeead0e9876097cacc6bf727b39a6;p=gcc.git 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 --- 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 + + 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 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 + + 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 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 + + PR middle-end/58809 + * c-c++-common/gomp/pr58809.c: New test. + 2014-01-23 Dominique Dhumieres 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" } */ + ; +}