re PR c++/33894 (pragma omp atomic broken)
PR c++/33894 * cp-tree.h: Update comment - TYPE_LANG_FLAG_0 is not OMP_ATOMIC_DEPENDENT_P in OMP_ATOMIC. * pt.c (tsubst_expr): Assert OMP_ATOMIC_DEPENDENT_P. * semantics.c (finish_omp_atomic): Revert most of the 2007-02-05 changes, just keep the new representation of OMP_ATOMIC_DEPENDENT_P OMP_ATOMIC. * testsuite/libgomp.c++/atomic-1.C: New test. From-SVN: r129919
This commit is contained in:
parent
873c716480
commit
239371f9c7
|
@ -1,3 +1,13 @@
|
||||||
|
2007-11-06 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/33894
|
||||||
|
* cp-tree.h: Update comment - TYPE_LANG_FLAG_0 is not
|
||||||
|
OMP_ATOMIC_DEPENDENT_P in OMP_ATOMIC.
|
||||||
|
* pt.c (tsubst_expr): Assert OMP_ATOMIC_DEPENDENT_P.
|
||||||
|
* semantics.c (finish_omp_atomic): Revert most of the
|
||||||
|
2007-02-05 changes, just keep the new representation of
|
||||||
|
OMP_ATOMIC_DEPENDENT_P OMP_ATOMIC.
|
||||||
|
|
||||||
2007-11-05 H.J. Lu <hongjiu.lu@intel.com>
|
2007-11-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR c++/33871
|
PR c++/33871
|
||||||
|
|
|
@ -53,7 +53,6 @@ struct diagnostic_info;
|
||||||
TYPENAME_IS_ENUM_P (in TYPENAME_TYPE)
|
TYPENAME_IS_ENUM_P (in TYPENAME_TYPE)
|
||||||
REFERENCE_REF_P (in INDIRECT_EXPR)
|
REFERENCE_REF_P (in INDIRECT_EXPR)
|
||||||
QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF)
|
QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF)
|
||||||
OMP_ATOMIC_DEPENDENT_P (in OMP_ATOMIC)
|
|
||||||
OMP_FOR_GIMPLIFYING_P (in OMP_FOR)
|
OMP_FOR_GIMPLIFYING_P (in OMP_FOR)
|
||||||
BASELINK_QUALIFIED_P (in BASELINK)
|
BASELINK_QUALIFIED_P (in BASELINK)
|
||||||
TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR)
|
TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR)
|
||||||
|
|
14
gcc/cp/pt.c
14
gcc/cp/pt.c
|
@ -10358,13 +10358,13 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OMP_ATOMIC:
|
case OMP_ATOMIC:
|
||||||
if (OMP_ATOMIC_DEPENDENT_P (t))
|
gcc_assert (OMP_ATOMIC_DEPENDENT_P (t));
|
||||||
{
|
{
|
||||||
tree op1 = TREE_OPERAND (t, 1);
|
tree op1 = TREE_OPERAND (t, 1);
|
||||||
tree lhs = RECUR (TREE_OPERAND (op1, 0));
|
tree lhs = RECUR (TREE_OPERAND (op1, 0));
|
||||||
tree rhs = RECUR (TREE_OPERAND (op1, 1));
|
tree rhs = RECUR (TREE_OPERAND (op1, 1));
|
||||||
finish_omp_atomic (TREE_CODE (op1), lhs, rhs);
|
finish_omp_atomic (TREE_CODE (op1), lhs, rhs);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EXPR_PACK_EXPANSION:
|
case EXPR_PACK_EXPANSION:
|
||||||
|
|
|
@ -3909,28 +3909,38 @@ finish_omp_for (location_t locus, tree decl, tree init, tree cond,
|
||||||
void
|
void
|
||||||
finish_omp_atomic (enum tree_code code, tree lhs, tree rhs)
|
finish_omp_atomic (enum tree_code code, tree lhs, tree rhs)
|
||||||
{
|
{
|
||||||
|
tree orig_lhs;
|
||||||
|
tree orig_rhs;
|
||||||
|
bool dependent_p;
|
||||||
tree stmt;
|
tree stmt;
|
||||||
|
|
||||||
if (processing_template_decl
|
orig_lhs = lhs;
|
||||||
&& (type_dependent_expression_p (lhs)
|
orig_rhs = rhs;
|
||||||
|| type_dependent_expression_p (rhs)))
|
dependent_p = false;
|
||||||
stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node,
|
stmt = NULL_TREE;
|
||||||
build2 (code, void_type_node, lhs, rhs));
|
|
||||||
else
|
/* Even in a template, we can detect invalid uses of the atomic
|
||||||
|
pragma if neither LHS nor RHS is type-dependent. */
|
||||||
|
if (processing_template_decl)
|
||||||
{
|
{
|
||||||
/* Even in a template, we can detect invalid uses of the atomic
|
dependent_p = (type_dependent_expression_p (lhs)
|
||||||
pragma if neither LHS nor RHS is type-dependent. */
|
|| type_dependent_expression_p (rhs));
|
||||||
if (processing_template_decl)
|
if (!dependent_p)
|
||||||
{
|
{
|
||||||
lhs = build_non_dependent_expr (lhs);
|
lhs = build_non_dependent_expr (lhs);
|
||||||
rhs = build_non_dependent_expr (rhs);
|
rhs = build_non_dependent_expr (rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt = c_finish_omp_atomic (code, lhs, rhs);
|
|
||||||
}
|
}
|
||||||
|
if (!dependent_p)
|
||||||
if (stmt != error_mark_node)
|
{
|
||||||
add_stmt (stmt);
|
stmt = c_finish_omp_atomic (code, lhs, rhs);
|
||||||
|
if (stmt == error_mark_node)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (processing_template_decl)
|
||||||
|
stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node,
|
||||||
|
build2 (code, void_type_node, orig_lhs, orig_rhs));
|
||||||
|
add_stmt (stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2007-11-06 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR c++/33894
|
||||||
|
* testsuite/libgomp.c++/atomic-1.C: New test.
|
||||||
|
|
||||||
2007-10-25 Jakub Jelinek <jakub@redhat.com>
|
2007-10-25 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR libgomp/33275
|
PR libgomp/33275
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
// PR c++/33894
|
||||||
|
// { dg-do run }
|
||||||
|
// { dg-options "-O2" }
|
||||||
|
|
||||||
|
extern "C" void abort ();
|
||||||
|
|
||||||
|
int check;
|
||||||
|
|
||||||
|
template<typename T> void
|
||||||
|
foo ()
|
||||||
|
{
|
||||||
|
#pragma omp atomic
|
||||||
|
check |= sizeof (T);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> void
|
||||||
|
bar (T *x, T y)
|
||||||
|
{
|
||||||
|
#pragma omp atomic
|
||||||
|
*x += y;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> void
|
||||||
|
baz ()
|
||||||
|
{
|
||||||
|
#pragma omp atomic
|
||||||
|
check++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
long l = 0;
|
||||||
|
|
||||||
|
check = 0;
|
||||||
|
foo<char> ();
|
||||||
|
if (check != sizeof (char))
|
||||||
|
abort ();
|
||||||
|
foo<short> ();
|
||||||
|
if (check != (sizeof (char) | sizeof (short)))
|
||||||
|
abort ();
|
||||||
|
bar(&i, 4);
|
||||||
|
bar(&l, 8L);
|
||||||
|
if (i != 4 || l != 8L)
|
||||||
|
abort ();
|
||||||
|
baz<char> ();
|
||||||
|
if (check != (sizeof (char) | sizeof (short)) + 1)
|
||||||
|
abort ();
|
||||||
|
baz<long double> ();
|
||||||
|
if (check != (sizeof (char) | sizeof (short)) + 2)
|
||||||
|
abort ();
|
||||||
|
}
|
Loading…
Reference in New Issue