From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 104905 invoked by alias); 3 Feb 2016 10:39:59 -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 104877 invoked by uid 89); 3 Feb 2016 10:39:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 spammy=nicht, ian_harveybigpondcom, ian_harvey@bigpond.com, desc X-Spam-User: qpsmtpd, 2 recipients X-HELO: mout.gmx.net Received: from mout.gmx.net (HELO mout.gmx.net) (212.227.15.18) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 03 Feb 2016 10:39:46 +0000 Received: from vepi2 ([92.213.0.123]) by mail.gmx.com (mrgmx003) with ESMTPSA (Nemesis) id 0MV5hN-1aYHkO26hB-00YVVb; Wed, 03 Feb 2016 11:39:41 +0100 Date: Wed, 03 Feb 2016 10:39:00 -0000 From: Andre Vehreschild To: Paul Richard Thomas Cc: GCC-Patches-ML , GCC-Fortran-ML Subject: Re: [Patch, fortran, pr67451, gcc-5, v1] [5/6 Regression] ICE with sourced allocation from coarray Message-ID: <20160203113940.6b2d3a11@vepi2> In-Reply-To: References: <20160129191724.2eb47e1b@vepi2> <20160201132024.71f5904f@vepi2> <20160201133448.36c1115b@vepi2> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/mMeURKA1C2wQGtw=pqA33Xg" X-UI-Out-Filterresults: notjunk:1;V01:K0:8fXlF+R5MSs=:lO172CdUHuqs5tfDiCh1C7 0y3UFmcp7NARhtp6FHws51596k44TkCo4vgRRecHHQY3Q6YfLW5wopvhFi37FokfKxoImjH79 SU709e6r20KwnfLixHCYo30l/2RPfteKIWYSkOHnlFmhjyJGUZsPcc2ZIOGcIbKxRQCjFtrKC Apqa6Lk7OjGbj2tj8gAP9XD39Ji/4Dtl7FzRLO6CkbjAzAX1qskj09xADa8JSSi5dsn+WaSGD 1ssEtQFGkxnBT63lxvj/ePz98HRSSmuhbBwr3Eb5xCPhuIGVmYZGfXjQdoBvli/4vK4pEfWhB avsBmmBy8qqls1qD3f6lWu9QgHfa/r+9CVekBJ4rjODi4n1wdBPT69EcOn2B//e0Gw4SD+XGZ 5yS7EacSNgiulNY8cGNXaYz7TOs5MsNZINDCHOJ68cTBAc91J2F6YzOAzzvjbcQAmZsPfycS8 sWW9QdVE+zi2jEC1B1WUe3Ugk3rO3P8zNiM3HG9AmxHm2Y/DCD3g0nS7RzwIf8sQEtMK0P1CR e0q7PNY+c9U21h60TJo/ufsoxEnFb0TI7Bk1NRPxMKR9jtNaj2AN+draJJkAT4wcT4/UXFOZP Mf/1XL0yaoZQ5D42eoZqPaRZpc2hPMS+xJz/0Lbl6xoe8qzLc1Z30Ezcy1iWUd3nC3rLZlEig LsdpiBBFYvz8XZHtNA1ulD8sE7sn/nJQZcJLmupnB5EOXD3Akcj9jDapYhnZCUQsXyI7NlfsM tvczj/cwzl6ZjDKABhKKI0hQoVGuyGT7Ljer/44nZ6xi0v8lXEDts1dkHdo= X-SW-Source: 2016-02/txt/msg00182.txt.bz2 --MP_/mMeURKA1C2wQGtw=pqA33Xg Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 2060 Hi Paul, thanks for the review. Committed as: r233099 for ggc-5, and r233101 for trunk. Regards, Andre On Tue, 2 Feb 2016 19:44:00 +0100 Paul Richard Thomas wrote: > Hi Andre, > > This one looks good too. As every day goes by, I see more and more why > Tobias was so keen to incorporate all objects into a single descriptor > type :-) > > OK for 5-branch. > > Thanks for both the patches > > Paul > > On 1 February 2016 at 13:34, Andre Vehreschild wrote: > > Oh, well, now with attachments. I am sorry. > > > > - Andre > > > > On Mon, 1 Feb 2016 13:20:24 +0100 > > Andre Vehreschild wrote: > > > >> Hi all, > >> > >> here is the backport of the patch for pr67451 for gcc-5. Because the > >> structure of the allocate() in trunk is quite different the patch looks > >> somewhat different, too, but essentially does the same. > >> > >> Bootstrapped and regtests ok on x86_64-linux-gnu/F23. > >> > >> Ok for gcc-5-branch? > >> > >> Here is the link to the mainline patch: > >> https://gcc.gnu.org/ml/fortran/2016-01/msg00093.html > >> > >> Regards, > >> Andre > >> > >> On Fri, 29 Jan 2016 19:17:24 +0100 > >> Andre Vehreschild wrote: > >> > >> > Hi all, > >> > > >> > attached is a patch to fix a regression in current gfortran when a > >> > coarray is used in the source=-expression of an allocate(). The ICE was > >> > caused by the class information, i.e., _vptr and so on, not at the > >> > expected place. The patch fixes this. > >> > > >> > The patch also fixes pr69418, which I will flag as a duplicate in a > >> > second. > >> > > >> > Bootstrapped and regtested ok on x86_64-linux-gnu/F23. > >> > > >> > Ok for trunk? > >> > > >> > Backport to gcc-5 is pending, albeit more difficult, because the > >> > allocate() implementation on 5 is not as advanced the one in 6. > >> > > >> > Regards, > >> > Andre > >> > >> > > > > > > -- > > Andre Vehreschild * Email: vehre ad gmx dot de > > > -- Andre Vehreschild * Email: vehre ad gmx dot de --MP_/mMeURKA1C2wQGtw=pqA33Xg Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=submit5.diff Content-length: 7590 Index: gcc/fortran/ChangeLog =================================================================== --- gcc/fortran/ChangeLog (Revision 233098) +++ gcc/fortran/ChangeLog (Arbeitskopie) @@ -1,3 +1,13 @@ +2016-02-03 Andre Vehreschild + + PR fortran/67451 + PR fortran/69418 + * trans-expr.c (gfc_copy_class_to_class): For coarrays just the + pointer is passed. Take it as is without trying to deref the + _data component. + * trans-stmt.c (gfc_trans_allocate): Take care of coarrays as + argument to source=-expression. + 2016-01-30 Bud Davis Mikael Morin Index: gcc/fortran/trans-expr.c =================================================================== --- gcc/fortran/trans-expr.c (Revision 233098) +++ gcc/fortran/trans-expr.c (Arbeitskopie) @@ -1019,6 +1019,7 @@ tree fcn; tree fcn_type; tree from_data; + tree from_class_base = NULL; tree from_len; tree to_data; tree to_len; @@ -1035,21 +1036,41 @@ from_len = to_len = NULL_TREE; if (from != NULL_TREE) - fcn = gfc_class_vtab_copy_get (from); + { + /* Check that from is a class. When the class is part of a coarray, + then from is a common pointer and is to be used as is. */ + tmp = POINTER_TYPE_P (TREE_TYPE (from)) && !DECL_P (from) + ? TREE_OPERAND (from, 0) : from; + if (GFC_CLASS_TYPE_P (TREE_TYPE (tmp)) + || (DECL_P (tmp) && GFC_DECL_CLASS (tmp))) + { + from_class_base = from; + from_data = gfc_class_data_get (from_class_base); + } + else + { + /* For arrays two component_refs can be present. */ + if (TREE_CODE (tmp) == COMPONENT_REF) + tmp = TREE_OPERAND (tmp, 0); + if (TREE_CODE (tmp) == COMPONENT_REF) + tmp = TREE_OPERAND (tmp, 0); + from_class_base = tmp; + from_data = from; + } + fcn = gfc_class_vtab_copy_get (from_class_base); + } else - fcn = gfc_class_vtab_copy_get (to); + { + fcn = gfc_class_vtab_copy_get (to); + from_data = gfc_class_vtab_def_init_get (to); + } fcn_type = TREE_TYPE (TREE_TYPE (fcn)); - if (from != NULL_TREE) - from_data = gfc_class_data_get (from); - else - from_data = gfc_class_vtab_def_init_get (to); - if (unlimited) { - if (from != NULL_TREE && unlimited) - from_len = gfc_class_len_get (from); + if (from_class_base != NULL_TREE) + from_len = gfc_class_len_get (from_class_base); else from_len = integer_zero_node; } Index: gcc/fortran/trans-stmt.c =================================================================== --- gcc/fortran/trans-stmt.c (Revision 233098) +++ gcc/fortran/trans-stmt.c (Arbeitskopie) @@ -5180,7 +5180,7 @@ _vptr, _len and element_size for expr3. */ if (code->expr3) { - bool vtab_needed = false; + bool vtab_needed = false, is_coarray = gfc_is_coarray (code->expr3); /* expr3_tmp gets the tree when code->expr3.mold is set, i.e., the expression is only needed to get the _vptr, _len a.s.o. */ tree expr3_tmp = NULL_TREE; @@ -5245,7 +5245,8 @@ { tree var; - tmp = build_fold_indirect_ref_loc (input_location, + tmp = is_coarray ? se.expr + : build_fold_indirect_ref_loc (input_location, se.expr); /* We need a regular (non-UID) symbol here, therefore give a @@ -5297,6 +5298,16 @@ else if (expr3_tmp != NULL_TREE && (VAR_P (expr3_tmp) ||!code->expr3->ref)) tmp = gfc_class_vptr_get (expr3_tmp); + else if (is_coarray && expr3 != NULL_TREE) + { + /* Get the ref to coarray's data. May be wrapped in a + NOP_EXPR. */ + tmp = POINTER_TYPE_P (TREE_TYPE (expr3)) ? TREE_OPERAND (expr3, 0) + : tmp; + /* Get to the base variable, i.e., strip _data.data. */ + tmp = TREE_OPERAND (TREE_OPERAND (tmp, 0), 0); + tmp = gfc_class_vptr_get (tmp); + } else { rhs = gfc_find_and_cut_at_last_class_ref (code->expr3); Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (Revision 233098) +++ gcc/testsuite/ChangeLog (Arbeitskopie) @@ -1,3 +1,11 @@ +2016-02-03 Andre Vehreschild + + PR fortran/67451 + PR fortran/69418 + * gfortran.dg/coarray_allocate_2.f08: New test. + * gfortran.dg/coarray_allocate_3.f08: New test. + * gfortran.dg/coarray_allocate_4.f08: New test. + 2016-02-02 Alan Modra PR target/69548 Index: gcc/testsuite/gfortran.dg/coarray_allocate_2.f08 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_allocate_2.f08 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_allocate_2.f08 (Arbeitskopie) @@ -0,0 +1,26 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! Contributed by Ian Harvey +! Extended by Andre Vehreschild +! to test that coarray references in allocate work now +! PR fortran/67451 + + program main + implicit none + type foo + integer :: bar = 99 + end type + class(foo), allocatable :: foobar[:] + class(foo), allocatable :: some_local_object + allocate(foobar[*]) + + allocate(some_local_object, source=foobar) + + if (.not. allocated(foobar)) call abort() + if (.not. allocated(some_local_object)) call abort() + + deallocate(some_local_object) + deallocate(foobar) + end program + Index: gcc/testsuite/gfortran.dg/coarray_allocate_3.f08 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_allocate_3.f08 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_allocate_3.f08 (Arbeitskopie) @@ -0,0 +1,28 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! Contributed by Ian Harvey +! Extended by Andre Vehreschild +! to test that coarray references in allocate work now +! PR fortran/67451 + + program main + implicit none + type foo + integer :: bar = 99 + end type + class(foo), dimension(:), allocatable :: foobar[:] + class(foo), dimension(:), allocatable :: some_local_object + allocate(foobar(10)[*]) + + allocate(some_local_object(10), source=foobar) + + if (.not. allocated(foobar)) call abort() + if (lbound(foobar, 1) /= 1 .OR. ubound(foobar, 1) /= 10) call abort() + if (.not. allocated(some_local_object)) call abort() + if (any(some_local_object(:)%bar /= [99, 99, 99, 99, 99, 99, 99, 99, 99, 99])) call abort() + + deallocate(some_local_object) + deallocate(foobar) + end program + Index: gcc/testsuite/gfortran.dg/coarray_allocate_4.f08 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_allocate_4.f08 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_allocate_4.f08 (Arbeitskopie) @@ -0,0 +1,43 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! Contributed by Gerhard Steinmetz +! Andre Vehreschild +! Check that PR fortran/69451 is fixed. + +program main + +implicit none + +type foo +end type + +class(foo), allocatable :: p[:] +class(foo), pointer :: r +class(*), allocatable, target :: z + +allocate(p[*]) + +call s(p, z) +select type (z) + class is (foo) + r => z + class default + call abort() +end select + +if (.not. associated(r)) call abort() + +deallocate(r) +deallocate(p) + +contains + +subroutine s(x, z) + class(*) :: x[*] + class(*), allocatable:: z + allocate (z, source=x) +end + +end + --MP_/mMeURKA1C2wQGtw=pqA33Xg Content-Type: text/x-patch Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=submit.diff Content-length: 7274 Index: gcc/fortran/ChangeLog =================================================================== --- gcc/fortran/ChangeLog (Revision 233100) +++ gcc/fortran/ChangeLog (Arbeitskopie) @@ -1,3 +1,13 @@ +2016-02-03 Andre Vehreschild + + PR fortran/67451 + PR fortran/69418 + * trans-expr.c (gfc_copy_class_to_class): For coarrays just the + pointer is passed. Take it as is without trying to deref the + _data component. + * trans-stmt.c (gfc_trans_allocate): Take care of coarrays as + argument to source=-expression. + 2016-02-02 Nathan Sidwell * lang.opt (fopenacc-dim=): New option. Index: gcc/fortran/trans-expr.c =================================================================== --- gcc/fortran/trans-expr.c (Revision 233100) +++ gcc/fortran/trans-expr.c (Arbeitskopie) @@ -1103,7 +1103,14 @@ } else { - from_data = gfc_class_data_get (from); + /* Check that from is a class. When the class is part of a coarray, + then from is a common pointer and is to be used as is. */ + tmp = POINTER_TYPE_P (TREE_TYPE (from)) + ? build_fold_indirect_ref (from) : from; + from_data = + (GFC_CLASS_TYPE_P (TREE_TYPE (tmp)) + || (DECL_P (tmp) && GFC_DECL_CLASS (tmp))) + ? gfc_class_data_get (from) : from; is_from_desc = GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (from_data)); } } Index: gcc/fortran/trans-stmt.c =================================================================== --- gcc/fortran/trans-stmt.c (Revision 233100) +++ gcc/fortran/trans-stmt.c (Arbeitskopie) @@ -5358,7 +5358,8 @@ expression. */ if (code->expr3) { - bool vtab_needed = false, temp_var_needed = false; + bool vtab_needed = false, temp_var_needed = false, + is_coarray = gfc_is_coarray (code->expr3); /* Figure whether we need the vtab from expr3. */ for (al = code->ext.alloc.list; !vtab_needed && al != NULL; @@ -5392,9 +5393,9 @@ with the POINTER_PLUS_EXPR in this case. */ if (code->expr3->ts.type == BT_CLASS && TREE_CODE (se.expr) == NOP_EXPR - && TREE_CODE (TREE_OPERAND (se.expr, 0)) - == POINTER_PLUS_EXPR) - //&& ! GFC_CLASS_TYPE_P (TREE_TYPE (se.expr))) + && (TREE_CODE (TREE_OPERAND (se.expr, 0)) + == POINTER_PLUS_EXPR + || is_coarray)) se.expr = TREE_OPERAND (se.expr, 0); } /* Create a temp variable only for component refs to prevent @@ -5435,7 +5436,7 @@ if (se.expr != NULL_TREE && temp_var_needed) { tree var, desc; - tmp = GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se.expr)) ? + tmp = GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se.expr)) || is_coarray ? se.expr : build_fold_indirect_ref_loc (input_location, se.expr); @@ -5448,7 +5449,7 @@ { /* When an array_ref was in expr3, then the descriptor is the first operand. */ - if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp))) + if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)) || is_coarray) { desc = TREE_OPERAND (tmp, 0); } @@ -5460,11 +5461,12 @@ e3_is = E3_DESC; } else - desc = se.expr; + desc = !is_coarray ? se.expr + : TREE_OPERAND (TREE_OPERAND (se.expr, 0), 0); /* We need a regular (non-UID) symbol here, therefore give a prefix. */ var = gfc_create_var (TREE_TYPE (tmp), "source"); - if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp))) + if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)) || is_coarray) { gfc_allocate_lang_decl (var); GFC_DECL_SAVED_DESCRIPTOR (var) = desc; Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (Revision 233100) +++ gcc/testsuite/ChangeLog (Arbeitskopie) @@ -1,3 +1,11 @@ +2016-02-03 Andre Vehreschild + + PR fortran/67451 + PR fortran/69418 + * gfortran.dg/coarray_allocate_2.f08: New test. + * gfortran.dg/coarray_allocate_3.f08: New test. + * gfortran.dg/coarray_allocate_4.f08: New test. + 2016-02-03 Alan Lawrence * gcc.dg/vect/vect-outer-1-big-array.c: Drop vect_multiple_sizes; Index: gcc/testsuite/gfortran.dg/coarray_allocate_2.f08 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_allocate_2.f08 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_allocate_2.f08 (Arbeitskopie) @@ -0,0 +1,26 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! Contributed by Ian Harvey +! Extended by Andre Vehreschild +! to test that coarray references in allocate work now +! PR fortran/67451 + + program main + implicit none + type foo + integer :: bar = 99 + end type + class(foo), allocatable :: foobar[:] + class(foo), allocatable :: some_local_object + allocate(foobar[*]) + + allocate(some_local_object, source=foobar) + + if (.not. allocated(foobar)) call abort() + if (.not. allocated(some_local_object)) call abort() + + deallocate(some_local_object) + deallocate(foobar) + end program + Index: gcc/testsuite/gfortran.dg/coarray_allocate_3.f08 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_allocate_3.f08 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_allocate_3.f08 (Arbeitskopie) @@ -0,0 +1,28 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! Contributed by Ian Harvey +! Extended by Andre Vehreschild +! to test that coarray references in allocate work now +! PR fortran/67451 + + program main + implicit none + type foo + integer :: bar = 99 + end type + class(foo), dimension(:), allocatable :: foobar[:] + class(foo), dimension(:), allocatable :: some_local_object + allocate(foobar(10)[*]) + + allocate(some_local_object, source=foobar) + + if (.not. allocated(foobar)) call abort() + if (lbound(foobar, 1) /= 1 .OR. ubound(foobar, 1) /= 10) call abort() + if (.not. allocated(some_local_object)) call abort() + if (any(some_local_object(:)%bar /= [99, 99, 99, 99, 99, 99, 99, 99, 99, 99])) call abort() + + deallocate(some_local_object) + deallocate(foobar) + end program + Index: gcc/testsuite/gfortran.dg/coarray_allocate_4.f08 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_allocate_4.f08 (nicht existent) +++ gcc/testsuite/gfortran.dg/coarray_allocate_4.f08 (Arbeitskopie) @@ -0,0 +1,43 @@ +! { dg-do run } +! { dg-options "-fcoarray=single" } +! +! Contributed by Gerhard Steinmetz +! Andre Vehreschild +! Check that PR fortran/69451 is fixed. + +program main + +implicit none + +type foo +end type + +class(foo), allocatable :: p[:] +class(foo), pointer :: r +class(*), allocatable, target :: z + +allocate(p[*]) + +call s(p, z) +select type (z) + class is (foo) + r => z + class default + call abort() +end select + +if (.not. associated(r)) call abort() + +deallocate(r) +deallocate(p) + +contains + +subroutine s(x, z) + class(*) :: x[*] + class(*), allocatable:: z + allocate (z, source=x) +end + +end + --MP_/mMeURKA1C2wQGtw=pqA33Xg--