From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 130198 invoked by alias); 12 Aug 2016 16:16:05 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 130179 invoked by uid 89); 12 Aug 2016 16:16:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=1,10, 1,3 X-Spam-User: qpsmtpd, 2 recipients X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 12 Aug 2016 16:15:54 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-FEM-01.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1bYF7g-0006C2-5S from Thomas_Schwinge@mentor.com ; Fri, 12 Aug 2016 09:15:52 -0700 Received: from hertz.schwinge.homeip.net (137.202.0.76) by SVR-IES-FEM-01.mgc.mentorg.com (137.202.0.104) with Microsoft SMTP Server id 14.3.224.2; Fri, 12 Aug 2016 17:13:50 +0100 From: Thomas Schwinge To: , CC: Cesar Philippidis , Tobias Burnus , Jakub Jelinek Subject: [PR fortran/72741] Handle intrinsic functions specified in !$ACC ROUTINE ( NAME ) User-Agent: Notmuch/0.9-101-g81dad07 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) Date: Fri, 12 Aug 2016 16:16:00 -0000 Message-ID: <87y442ge2w.fsf@hertz.schwinge.homeip.net> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-SW-Source: 2016-08/txt/msg01044.txt.bz2 Hi! Let me actually break this out of the other pending patches; this should be uncontroversial. Originally by Cesar, extended by me. OK for trunk? commit a0fee96c0f204814e87ddf6635f9cbec2afc6887 Author: Thomas Schwinge Date: Fri Aug 12 17:19:05 2016 +0200 [PR fortran/72741] Handle intrinsic functions specified in !$ACC ROUTIN= E ( NAME ) =20=20=20=20 gcc/fortran/ * openmp.c (gfc_match_oacc_routine): Handle intrinsic functions. gcc/testsuite/ * gfortran.dg/goacc/pr72741-intrinsic-1.f: New file. * gfortran.dg/goacc/pr72741-intrinsic-2.f: Likewise. --- gcc/fortran/openmp.c | 26 ++++++++++++++++= ---- .../gfortran.dg/goacc/pr72741-intrinsic-1.f | 20 +++++++++++++++ .../gfortran.dg/goacc/pr72741-intrinsic-2.f | 22 +++++++++++++++++ 3 files changed, 63 insertions(+), 5 deletions(-) diff --git gcc/fortran/openmp.c gcc/fortran/openmp.c index 9fff994..dc8197e 100644 --- gcc/fortran/openmp.c +++ gcc/fortran/openmp.c @@ -1748,8 +1748,9 @@ match gfc_match_oacc_routine (void) { locus old_loc; + match m; + gfc_intrinsic_sym *isym =3D NULL; gfc_symbol *sym =3D NULL; - match m; gfc_omp_clauses *c =3D NULL; gfc_oacc_routine_name *n =3D NULL; =20 @@ -1769,12 +1770,14 @@ gfc_match_oacc_routine (void) if (m =3D=3D MATCH_YES) { char buffer[GFC_MAX_SYMBOL_LEN + 1]; - gfc_symtree *st; + gfc_symtree *st =3D NULL; =20 m =3D gfc_match_name (buffer); if (m =3D=3D MATCH_YES) { - st =3D gfc_find_symtree (gfc_current_ns->sym_root, buffer); + if ((isym =3D gfc_find_function (buffer)) =3D=3D NULL + && (isym =3D gfc_find_subroutine (buffer)) =3D=3D NULL) + st =3D gfc_find_symtree (gfc_current_ns->sym_root, buffer); if (st) { sym =3D st->n.sym; @@ -1782,7 +1785,7 @@ gfc_match_oacc_routine (void) sym =3D NULL; } =20 - if (st =3D=3D NULL + if ((isym =3D=3D NULL && st =3D=3D NULL) || (sym && !sym->attr.external && !sym->attr.function @@ -1816,7 +1819,18 @@ gfc_match_oacc_routine (void) !=3D MATCH_YES)) return MATCH_ERROR; =20 - if (sym !=3D NULL) + if (isym !=3D NULL) + { + if (c && (c->gang || c->worker || c->vector)) + { + gfc_error ("Intrinsic function specified in !$ACC ROUTINE ( NAME )" + " at %C, with incompatible GANG, WORKER, or VECTOR clause"); + goto cleanup; + } + /* The intrinsic symbol has been marked with a SEQ, or with no claus= e at + all, which is OK. */ + } + else if (sym !=3D NULL) { n =3D gfc_get_oacc_routine_name (); n->sym =3D sym; @@ -1836,6 +1850,8 @@ gfc_match_oacc_routine (void) gfc_current_ns->proc_name->attr.oacc_function =3D gfc_oacc_routine_dims (c) + 1; } + else + gcc_unreachable (); =20 if (n) n->clauses =3D c; diff --git gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-1.f gcc/testsu= ite/gfortran.dg/goacc/pr72741-intrinsic-1.f new file mode 100644 index 0000000..4bff3e3 --- /dev/null +++ gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-1.f @@ -0,0 +1,20 @@ +! Check for valid clauses with intrinsic function specified in !$ACC ROUTI= NE ( NAME ). + + SUBROUTINE sub_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) +!$ACC ROUTINE (ABORT) SEQ + + CALL ABORT + END SUBROUTINE sub_1 + + MODULE m_w_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) SEQ +!$ACC ROUTINE (ABORT) + + CONTAINS + SUBROUTINE sub_2 + CALL ABORT + END SUBROUTINE sub_2 + END MODULE m_w_1 diff --git gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-2.f gcc/testsu= ite/gfortran.dg/goacc/pr72741-intrinsic-2.f new file mode 100644 index 0000000..fed8e76 --- /dev/null +++ gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-2.f @@ -0,0 +1,22 @@ +! Check for invalid clauses with intrinsic function specified in !$ACC ROU= TINE ( NAME ). + + SUBROUTINE sub_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) WORKER ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } +!$ACC ROUTINE (ABORT) GANG ! { dg-error "Intrinsic function specified in \= \!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER, = or VECTOR clause" } +!$ACC ROUTINE (ABORT) VECTOR ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } + + CALL ABORT + END SUBROUTINE sub_1 + + MODULE m_w_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) VECTOR ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } +!$ACC ROUTINE (ABORT) WORKER ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } +!$ACC ROUTINE (ABORT) GANG ! { dg-error "Intrinsic function specified in \= \!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER, = or VECTOR clause" } + + CONTAINS + SUBROUTINE sub_2 + CALL ABORT + END SUBROUTINE sub_2 + END MODULE m_w_1 Already committed to gomp-4_0-branch in r239422: commit 490d6fe982666a873ed30d1b2a011090980324e4 Author: tschwinge Date: Fri Aug 12 16:12:33 2016 +0000 [PR fortran/72741] Check clauses with intrinsic function specified in != $ACC ROUTINE ( NAME ) =20=20=20=20 gcc/fortran/ * openmp.c (gfc_match_oacc_routine): Check clauses of intrinsic functions. gcc/testsuite/ * gfortran.dg/goacc/pr72741-intrinsic-1.f: New file. * gfortran.dg/goacc/pr72741-intrinsic-2.f: Likewise. =20=20=20=20 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@2394= 22 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog.gomp | 7 ++++++ gcc/fortran/openmp.c | 25 +++++++++++++---= ---- gcc/testsuite/ChangeLog.gomp | 7 ++++++ .../gfortran.dg/goacc/pr72741-intrinsic-1.f | 20 ++++++++++++++++ .../gfortran.dg/goacc/pr72741-intrinsic-2.f | 22 +++++++++++++++++ 5 files changed, 73 insertions(+), 8 deletions(-) diff --git gcc/fortran/ChangeLog.gomp gcc/fortran/ChangeLog.gomp index 8744607..8b4ffc9 100644 --- gcc/fortran/ChangeLog.gomp +++ gcc/fortran/ChangeLog.gomp @@ -1,3 +1,10 @@ +2016-08-12 Cesar Philippidis + Thomas Schwinge + + PR fortran/72741 + * openmp.c (gfc_match_oacc_routine): Check clauses of intrinsic + functions. + 2016-07-29 Chung-Lin Tang =20 PR fortran/70598 diff --git gcc/fortran/openmp.c gcc/fortran/openmp.c index e463df7..80f46c0 100644 --- gcc/fortran/openmp.c +++ gcc/fortran/openmp.c @@ -1919,11 +1919,11 @@ match gfc_match_oacc_routine (void) { locus old_loc; + match m; + gfc_intrinsic_sym *isym =3D NULL; gfc_symbol *sym =3D NULL; - match m; gfc_omp_clauses *c =3D NULL; gfc_oacc_routine_name *n =3D NULL; - gfc_intrinsic_sym *isym =3D NULL; oacc_function dims =3D OACC_FUNCTION_NONE; =20 old_loc =3D gfc_current_locus; @@ -1957,7 +1957,7 @@ gfc_match_oacc_routine (void) sym =3D NULL; } =20 - if ((st =3D=3D NULL && isym =3D=3D NULL) + if ((isym =3D=3D NULL && st =3D=3D NULL) || (sym && !sym->attr.external && !sym->attr.function @@ -1996,14 +1996,21 @@ gfc_match_oacc_routine (void) dims =3D gfc_oacc_routine_dims (c); if (dims =3D=3D OACC_FUNCTION_NONE) { - gfc_error ("Multiple loop axes specified for routine %C"); - gfc_current_locus =3D old_loc; - return MATCH_ERROR; + gfc_error ("Multiple loop axes specified in !$ACC ROUTINE at %C"); + goto cleanup; } =20 if (isym !=3D NULL) - /* There is nothing to do for intrinsic procedures. */ - ; + { + if (c && (c->gang || c->worker || c->vector)) + { + gfc_error ("Intrinsic function specified in !$ACC ROUTINE ( NAME )" + " at %C, with incompatible GANG, WORKER, or VECTOR clause"); + goto cleanup; + } + /* The intrinsic symbol has been marked with a SEQ, or with no claus= e at + all, which is OK. */ + } else if (sym !=3D NULL) { n =3D gfc_get_oacc_routine_name (); @@ -2025,6 +2032,8 @@ gfc_match_oacc_routine (void) gfc_current_ns->proc_name->attr.oacc_function_nohost =3D c ? c->nohost : false; } + else + gcc_unreachable (); =20 if (n) n->clauses =3D c; diff --git gcc/testsuite/ChangeLog.gomp gcc/testsuite/ChangeLog.gomp index 0b96504..8de44b6 100644 --- gcc/testsuite/ChangeLog.gomp +++ gcc/testsuite/ChangeLog.gomp @@ -1,3 +1,10 @@ +2016-08-12 Cesar Philippidis + Thomas Schwinge + + PR fortran/72741 + * gfortran.dg/goacc/pr72741-intrinsic-1.f: New file. + * gfortran.dg/goacc/pr72741-intrinsic-2.f: Likewise. + 2016-08-04 Thomas Schwinge =20 * g++.dg/goacc/routine-2.C: Update. diff --git gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-1.f gcc/testsu= ite/gfortran.dg/goacc/pr72741-intrinsic-1.f new file mode 100644 index 0000000..4bff3e3 --- /dev/null +++ gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-1.f @@ -0,0 +1,20 @@ +! Check for valid clauses with intrinsic function specified in !$ACC ROUTI= NE ( NAME ). + + SUBROUTINE sub_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) +!$ACC ROUTINE (ABORT) SEQ + + CALL ABORT + END SUBROUTINE sub_1 + + MODULE m_w_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) SEQ +!$ACC ROUTINE (ABORT) + + CONTAINS + SUBROUTINE sub_2 + CALL ABORT + END SUBROUTINE sub_2 + END MODULE m_w_1 diff --git gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-2.f gcc/testsu= ite/gfortran.dg/goacc/pr72741-intrinsic-2.f new file mode 100644 index 0000000..fed8e76 --- /dev/null +++ gcc/testsuite/gfortran.dg/goacc/pr72741-intrinsic-2.f @@ -0,0 +1,22 @@ +! Check for invalid clauses with intrinsic function specified in !$ACC ROU= TINE ( NAME ). + + SUBROUTINE sub_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) WORKER ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } +!$ACC ROUTINE (ABORT) GANG ! { dg-error "Intrinsic function specified in \= \!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER, = or VECTOR clause" } +!$ACC ROUTINE (ABORT) VECTOR ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } + + CALL ABORT + END SUBROUTINE sub_1 + + MODULE m_w_1 + IMPLICIT NONE +!$ACC ROUTINE (ABORT) VECTOR ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } +!$ACC ROUTINE (ABORT) WORKER ! { dg-error "Intrinsic function specified in= \\!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER= , or VECTOR clause" } +!$ACC ROUTINE (ABORT) GANG ! { dg-error "Intrinsic function specified in \= \!\\\$ACC ROUTINE \\( NAME \\) at \\(1\\), with incompatible GANG, WORKER, = or VECTOR clause" } + + CONTAINS + SUBROUTINE sub_2 + CALL ABORT + END SUBROUTINE sub_2 + END MODULE m_w_1 Gr=C3=BC=C3=9Fe Thomas