re PR c++/88976 (ICE in fold_convert_loc, at fold-const.c:2552)
PR c++/88976 * c-typeck.c (c_finish_omp_cancel): Diagnose more than one if on #pragma omp cancel with different modifiers. * semantics.c (finish_omp_cancel): Diagnose more than one if on #pragma omp cancel with different modifiers. 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: r268245
This commit is contained in:
parent
acac773aaa
commit
e21c449129
@ -1,3 +1,9 @@
|
||||
2019-01-24 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/88976
|
||||
* c-typeck.c (c_finish_omp_cancel): Diagnose more than one if
|
||||
on #pragma omp cancel with different modifiers.
|
||||
|
||||
2019-01-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR c/51628
|
||||
|
@ -12766,6 +12766,18 @@ c_finish_omp_cancel (location_t loc, tree clauses)
|
||||
&& OMP_CLAUSE_IF_MODIFIER (ifc) != VOID_CST)
|
||||
error_at (OMP_CLAUSE_LOCATION (ifc),
|
||||
"expected %<cancel%> %<if%> clause modifier");
|
||||
else
|
||||
{
|
||||
tree ifc2 = omp_find_clause (OMP_CLAUSE_CHAIN (ifc), OMP_CLAUSE_IF);
|
||||
if (ifc2 != NULL_TREE)
|
||||
{
|
||||
gcc_assert (OMP_CLAUSE_IF_MODIFIER (ifc) == VOID_CST
|
||||
&& OMP_CLAUSE_IF_MODIFIER (ifc2) != ERROR_MARK
|
||||
&& OMP_CLAUSE_IF_MODIFIER (ifc2) != VOID_CST);
|
||||
error_at (OMP_CLAUSE_LOCATION (ifc2),
|
||||
"expected %<cancel%> %<if%> clause modifier");
|
||||
}
|
||||
}
|
||||
|
||||
tree type = TREE_TYPE (OMP_CLAUSE_IF_EXPR (ifc));
|
||||
ifc = fold_build2_loc (OMP_CLAUSE_LOCATION (ifc), NE_EXPR,
|
||||
|
@ -1,3 +1,11 @@
|
||||
2019-01-24 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/88976
|
||||
* semantics.c (finish_omp_cancel): Diagnose more than one if
|
||||
on #pragma omp cancel with different modifiers. Use
|
||||
maybe_convert_cond when not in template or build_x_binary_op
|
||||
otherwise.
|
||||
|
||||
2019-01-23 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/88757 - qualified name treated wrongly as type.
|
||||
|
@ -9055,11 +9055,26 @@ finish_omp_cancel (tree clauses)
|
||||
&& OMP_CLAUSE_IF_MODIFIER (ifc) != VOID_CST)
|
||||
error_at (OMP_CLAUSE_LOCATION (ifc),
|
||||
"expected %<cancel%> %<if%> clause modifier");
|
||||
else
|
||||
{
|
||||
tree ifc2 = omp_find_clause (OMP_CLAUSE_CHAIN (ifc), OMP_CLAUSE_IF);
|
||||
if (ifc2 != NULL_TREE)
|
||||
{
|
||||
gcc_assert (OMP_CLAUSE_IF_MODIFIER (ifc) == VOID_CST
|
||||
&& OMP_CLAUSE_IF_MODIFIER (ifc2) != ERROR_MARK
|
||||
&& OMP_CLAUSE_IF_MODIFIER (ifc2) != VOID_CST);
|
||||
error_at (OMP_CLAUSE_LOCATION (ifc2),
|
||||
"expected %<cancel%> %<if%> clause modifier");
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -1,3 +1,12 @@
|
||||
2019-01-24 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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-24 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/89027
|
||||
|
15
gcc/testsuite/c-c++-common/gomp/cancel-2.c
Normal file
15
gcc/testsuite/c-c++-common/gomp/cancel-2.c
Normal file
@ -0,0 +1,15 @@
|
||||
/* { 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" } */
|
||||
#pragma omp cancel parallel if (cancel: 1) if (cancel: 1) /* { dg-error "too many 'if' clauses with 'cancel' modifier" } */
|
||||
#pragma omp cancel parallel if (cancel: 1) if (1) /* { dg-error "if any 'if' clause has modifier, then all 'if' clauses have to use modifier" } */
|
||||
#pragma omp cancel parallel if (cancel: 1) if (parallel: 1) /* { dg-error "expected 'cancel' 'if' clause modifier" } */
|
||||
#pragma omp cancel parallel if (1) if (cancel: 1) /* { dg-error "if any 'if' clause has modifier, then all 'if' clauses have to use modifier" } */
|
||||
#pragma omp cancel parallel if (parallel: 1) if (cancel: 1) /* { dg-error "expected 'cancel' 'if' clause modifier" } */
|
||||
}
|
||||
}
|
26
gcc/testsuite/g++.dg/gomp/cancel-1.C
Normal file
26
gcc/testsuite/g++.dg/gomp/cancel-1.C
Normal file
@ -0,0 +1,26 @@
|
||||
// PR c++/88976
|
||||
// { dg-do compile }
|
||||
|
||||
template <class T> 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);
|
||||
}
|
20
gcc/testsuite/g++.dg/gomp/cancel-2.C
Normal file
20
gcc/testsuite/g++.dg/gomp/cancel-2.C
Normal file
@ -0,0 +1,20 @@
|
||||
// PR c++/88976
|
||||
// { dg-do compile }
|
||||
|
||||
template <class T> 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);
|
||||
}
|
12
gcc/testsuite/g++.dg/gomp/cancel-3.C
Normal file
12
gcc/testsuite/g++.dg/gomp/cancel-3.C
Normal file
@ -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'" }
|
||||
}
|
||||
}
|
12
gcc/testsuite/gcc.dg/gomp/cancel-1.c
Normal file
12
gcc/testsuite/gcc.dg/gomp/cancel-1.c
Normal file
@ -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" } */
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user