On Thu, Oct 29, 2020 at 06:05:41PM +0100, Tobias Burnus wrote: > gcc/fortran/ChangeLog: > > * dump-parse-tree.c (show_omp_clauses): Handle atomic clauses. > (show_omp_node): Call it for atomic. > * gfortran.h (enum gfc_omp_atomic_op): Add GFC_OMP_ATOMIC_UNSET, > remove GFC_OMP_ATOMIC_SEQ_CST and GFC_OMP_ATOMIC_ACQ_REL. > (enum gfc_omp_memorder): Replace OMP_MEMORDER_LAST by > OMP_MEMORDER_UNSET, add OMP_MEMORDER_SEQ_CST/OMP_MEMORDER_RELAXED. > (gfc_omp_clauses): Add capture and atomic_op. > (gfc_code): remove omp_atomic. > * openmp.c (enum omp_mask1): Add atomic, capture, memorder clauses. > (gfc_match_omp_clauses): Match them. > (OMP_ATOMIC_CLAUSES): Add. > (gfc_match_omp_flush): Update for 'last' to 'unset' change. > (gfc_match_omp_oacc_atomic): Removed and placed content .. > (gfc_match_omp_atomic): ... here. Update for OpenMP 5 clauses. > (gfc_match_oacc_atomic): Match directly here. > (resolve_omp_atomic, gfc_resolve_omp_directive): Update. > * parse.c (parse_omp_oacc_atomic): Update for struct gfc_code changes. > * resolve.c (gfc_resolve_blocks): Update assert. > * st.c (gfc_free_statement): Also call for EXEC_O{ACC,MP}_ATOMIC. > * trans-openmp.c (gfc_trans_omp_atomic): Update. > (gfc_trans_omp_flush): Update for 'last' to 'unset' change. > > gcc/testsuite/ChangeLog: > > * gfortran.dg/gomp/atomic-2.f90: New test. > * gfortran.dg/gomp/atomic.f90: New test.
> + gfc_error ("OMP ATOMIC READ at %L incompatible with " > + "ACQ_REL or RELEASE clauses", &loc); > + gfc_error ("Unexpected junk after $ACC ATOMIC statement at %C"); > + gfc_free_omp_clauses (c); Would be nice to be consistent. I think most commonly in diagnostics we use !$OMP ... and !$ACC , $ACC is not used anywhere, and while some uses of just OMP ... crept in, they aren't used that much yet. > - = (gfc_omp_atomic_op) (atomic_code->ext.omp_atomic & > GFC_OMP_ATOMIC_MASK); > + = (gfc_omp_atomic_op) (atomic_code->ext.omp_clauses->atomic_op & > GFC_OMP_ATOMIC_MASK); Too long line. Otherwise LGTM. Jakub