From 419b92b7204f9303b0788ce1bc0c9c4611dae9c8 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 30 Aug 2019 13:31:02 +0200 Subject: [PATCH] backport: re PR c++/88976 (ICE in fold_convert_loc, at fold-const.c:2552) Backported from mainline 2019-01-24 Jakub Jelinek PR c++/88976 * semantics.c (finish_omp_cancel): Use maybe_convert_cond when not in template or build_x_binary_op otherwise. * c-c++-common/gomp/cancel-2.c: New test. * gcc.dg/gomp/cancel-1.c: New test. * g++.dg/gomp/cancel-1.C: New test. * g++.dg/gomp/cancel-2.C: New test. * g++.dg/gomp/cancel-3.C: New test. From-SVN: r275091 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/semantics.c | 11 +++++---- gcc/testsuite/ChangeLog | 9 ++++++++ gcc/testsuite/c-c++-common/gomp/cancel-2.c | 10 +++++++++ gcc/testsuite/g++.dg/gomp/cancel-1.C | 26 ++++++++++++++++++++++ gcc/testsuite/g++.dg/gomp/cancel-2.C | 20 +++++++++++++++++ gcc/testsuite/g++.dg/gomp/cancel-3.C | 12 ++++++++++ gcc/testsuite/gcc.dg/gomp/cancel-1.c | 12 ++++++++++ 8 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/gomp/cancel-2.c create mode 100644 gcc/testsuite/g++.dg/gomp/cancel-1.C create mode 100644 gcc/testsuite/g++.dg/gomp/cancel-2.C create mode 100644 gcc/testsuite/g++.dg/gomp/cancel-3.C create mode 100644 gcc/testsuite/gcc.dg/gomp/cancel-1.c diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1e60d3a52c91..350a73f88e93 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,12 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-01-24 Jakub Jelinek + + PR c++/88976 + * semantics.c (finish_omp_cancel): Use maybe_convert_cond when not in + template or build_x_binary_op otherwise. + 2019-01-21 Jakub Jelinek PR c++/88949 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 785fc4a7b380..0f25b6ecd39c 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -8691,10 +8691,13 @@ finish_omp_cancel (tree clauses) tree ifc = omp_find_clause (clauses, OMP_CLAUSE_IF); if (ifc != NULL_TREE) { - tree type = TREE_TYPE (OMP_CLAUSE_IF_EXPR (ifc)); - ifc = fold_build2_loc (OMP_CLAUSE_LOCATION (ifc), NE_EXPR, - boolean_type_node, OMP_CLAUSE_IF_EXPR (ifc), - build_zero_cst (type)); + if (!processing_template_decl) + ifc = maybe_convert_cond (OMP_CLAUSE_IF_EXPR (ifc)); + else + ifc = build_x_binary_op (OMP_CLAUSE_LOCATION (ifc), NE_EXPR, + OMP_CLAUSE_IF_EXPR (ifc), ERROR_MARK, + integer_zero_node, ERROR_MARK, + NULL, tf_warning_or_error); } else ifc = boolean_true_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8b2cd793cdc2..1aace97c0262 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,15 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-01-24 Jakub Jelinek + + PR c++/88976 + * c-c++-common/gomp/cancel-2.c: New test. + * gcc.dg/gomp/cancel-1.c: New test. + * g++.dg/gomp/cancel-1.C: New test. + * g++.dg/gomp/cancel-2.C: New test. + * g++.dg/gomp/cancel-3.C: New test. + 2019-01-22 Jakub Jelinek PR rtl-optimization/49429 diff --git a/gcc/testsuite/c-c++-common/gomp/cancel-2.c b/gcc/testsuite/c-c++-common/gomp/cancel-2.c new file mode 100644 index 000000000000..b69d48f5298a --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/cancel-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +void +foo (void) +{ + #pragma omp parallel + { + #pragma omp cancel parallel if (1) if (1) /* { dg-error "too many 'if' clauses without modifier" } */ + } +} diff --git a/gcc/testsuite/g++.dg/gomp/cancel-1.C b/gcc/testsuite/g++.dg/gomp/cancel-1.C new file mode 100644 index 000000000000..a6b1167856ff --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/cancel-1.C @@ -0,0 +1,26 @@ +// PR c++/88976 +// { dg-do compile } + +template void +foo (T x) +{ +#pragma omp parallel + { + #pragma omp cancel parallel if (x) + } +#pragma omp parallel + { + #pragma omp cancel parallel if (1 == 1) + } +} + +void +bar (int x, double y, long long z) +{ + foo (0); + foo (1LL); + foo (1.25); + foo (x); + foo (y); + foo (z); +} diff --git a/gcc/testsuite/g++.dg/gomp/cancel-2.C b/gcc/testsuite/g++.dg/gomp/cancel-2.C new file mode 100644 index 000000000000..c9269e7b326f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/cancel-2.C @@ -0,0 +1,20 @@ +// PR c++/88976 +// { dg-do compile } + +template void +foo (T x) +{ +#pragma omp parallel + { + #pragma omp cancel parallel if (x) // { dg-error "no match for" } + } +} + +struct S {}; + +void +bar () +{ + S s; + foo (s); +} diff --git a/gcc/testsuite/g++.dg/gomp/cancel-3.C b/gcc/testsuite/g++.dg/gomp/cancel-3.C new file mode 100644 index 000000000000..87e757b77680 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/cancel-3.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +struct S { int s; } s; + +void +foo (void) +{ + #pragma omp parallel + { + #pragma omp cancel parallel if (s) // { dg-error "could not convert 's' from 'S' to 'bool'" } + } +} diff --git a/gcc/testsuite/gcc.dg/gomp/cancel-1.c b/gcc/testsuite/gcc.dg/gomp/cancel-1.c new file mode 100644 index 000000000000..c2832905d18f --- /dev/null +++ b/gcc/testsuite/gcc.dg/gomp/cancel-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +struct S { int s; } s; + +void +foo (void) +{ + #pragma omp parallel + { + #pragma omp cancel parallel if (s) /* { dg-error "used struct type value where scalar is required" } */ + } +} -- 2.47.2