diff options
Diffstat (limited to 'gcc/c-omp.c')
-rw-r--r-- | gcc/c-omp.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/gcc/c-omp.c b/gcc/c-omp.c index ac107e6..fe56824 100644 --- a/gcc/c-omp.c +++ b/gcc/c-omp.c @@ -82,15 +82,18 @@ c_finish_omp_barrier (void) /* Complete a #pragma omp atomic construct. The expression to be - implemented atomically is LHS code= RHS. */ + implemented atomically is LHS code= RHS. The value returned is + either error_mark_node (if the construct was erroneous) or an + OMP_ATOMIC node which should be added to the current statement tree + with add_stmt. */ -void +tree c_finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) { tree x, type, addr; if (lhs == error_mark_node || rhs == error_mark_node) - return; + return error_mark_node; /* ??? According to one reading of the OpenMP spec, complex type are supported, but there are no atomic stores for any architecture. @@ -102,7 +105,7 @@ c_finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) && !SCALAR_FLOAT_TYPE_P (type)) { error ("invalid expression type for %<#pragma omp atomic%>"); - return; + return error_mark_node; } /* ??? Validate that rhs does not overlap lhs. */ @@ -111,7 +114,7 @@ c_finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) via indirection. */ addr = build_unary_op (ADDR_EXPR, lhs, 0); if (addr == error_mark_node) - return; + return error_mark_node; addr = save_expr (addr); lhs = build_indirect_ref (addr, NULL); @@ -120,12 +123,12 @@ c_finish_omp_atomic (enum tree_code code, tree lhs, tree rhs) to do this, and then take it apart again. */ x = build_modify_expr (lhs, code, rhs); if (x == error_mark_node) - return; + return error_mark_node; gcc_assert (TREE_CODE (x) == MODIFY_EXPR); rhs = TREE_OPERAND (x, 1); /* Punt the actual generation of atomic operations to common code. */ - add_stmt (build2 (OMP_ATOMIC, void_type_node, addr, rhs)); + return build2 (OMP_ATOMIC, void_type_node, addr, rhs); } |