From patchwork Wed Feb 10 11:26:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Vehreschild X-Patchwork-Id: 581382 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id B058A140783 for ; Wed, 10 Feb 2016 22:26:40 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=BiE8509q; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:in-reply-to:references :mime-version:content-type; q=dns; s=default; b=oYAN+kQlxrnioEJI LCfrbPl2Cdr9d6HZITLtuWJSqIqcMbO/9E6e4bKUfSXzs2XP+P4kx5zuWdDC9jCD gLc+tEPHMIWLflCEtA0Y1P1MoQneSw/ZHI6EtQuPMj3Lp6pao+aX0K9LhSho2Phw tFBhBuCVVT375Ceu7upisqx94PM= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:in-reply-to:references :mime-version:content-type; s=default; bh=uKgxTUs9Y6tpwqd+l/QDeF QY9a8=; b=BiE8509q1WMvT7qUBMrgG6M6u2aTeM8ou3t2PDNvqOESwICuQFF+et oE0Y+ZTl7ZXkiEqIQufkArN+akRZ+Q7Cgq5xCg7l0JcuSFi9g8bS/2m2uyM1gPrW 3qf/MWjdEUYBXMpmqg88rn9oKtvymmtnX9WqtOBqjZoIKnNsZE+/o= Received: (qmail 2585 invoked by alias); 10 Feb 2016 11:26:33 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 2535 invoked by uid 89); 10 Feb 2016 11:26:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=occurring, Andre, andre, symtree X-Spam-User: qpsmtpd, 2 recipients X-HELO: mout.gmx.net Received: from mout.gmx.net (HELO mout.gmx.net) (212.227.17.20) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 10 Feb 2016 11:26:29 +0000 Received: from vepi2 ([92.213.0.123]) by mail.gmx.com (mrgmx101) with ESMTPSA (Nemesis) id 0M1SLt-1a9agK3hkH-00tU7W; Wed, 10 Feb 2016 12:26:26 +0100 Date: Wed, 10 Feb 2016 12:26:24 +0100 From: Andre Vehreschild To: Paul Richard Thomas Cc: GCC-Patches-ML , GCC-Fortran-ML Subject: Re: [Patch, fortran, pr67451, v1] [5/6 Regression] ICE with sourced allocation from coarray Message-ID: <20160210122624.2114b57d@vepi2> In-Reply-To: References: <20160129191724.2eb47e1b@vepi2> MIME-Version: 1.0 X-UI-Out-Filterresults: notjunk:1; V01:K0:Ubw6WyG/bSc=:yLCLEGie3VZ95gtoMGDdfM hK1dVNbUm0H1uAG8wGyLXevjsP2wKJ0h8t6B6uwo4WdCdf8yE1NFnkdC/2NhnSbyNGF+2ldAI T8rE4ccrIVez3ANC5+sCGgVHfmYYm/K6vTarR0FUv91kcGZUwttZa5HFzvhb+Ta0bjBfop6WD cybsprB7GQddIM2zIySMlVFwTvH8GI2sRHD7VpqlIG2ctuWhppdkGosStuXwuAjn4mNtx+HWN M42aAAqQhJNaPlXmpwgQWPKOSbvYcShIAgr8e+LjHmDgy6H1OMCuAXw+QF+UKEPzhBPYKpB8R 4WpYIuIFQko/HPNjmppIPLsRHsituScBX69jbOSfBjS4aFJ588FNNDIsItq9N9aO9gx4piph8 eZAWw/NY/4UwTWZktkNKIdsLF+xUkg+XqZCZgkxsYggFuJFbd+iIoBLpl2tSfCYmrWYPiocro RgOg6EatwwJNRSFdQADoUwntl6VDnzJcREuyJx+eM3WCXpqBjpC5ieLcNSZgXymCWogpbamob XBX8E7inHPRkAa3/8/VEHKOUQttK47Oh6dSAOSYoVT5PHflzP/zYeH20henLXRfma7da+0dO4 kQLFgAt54d+t5HqOT2bCIPwyneCZDG/sbeSExOycsqv3Xrad8Gh/sXqEFXPpfr4+AEZ6x9rKp iAS5OycHBDEIuVLWi0U94B3RU6L37cgNuvkrlDMCqszemrmXlk1ck6kVv1xaTMDL3kozQTtzg YlzjFAO+Sr2ypmvhI7Np3N7F4ACoAhhhpYSde2+Vs2U/pW+IdSgXsJTrTko= Hi all, unfortunately was my last patch for pr67451 not perfect and introduced regressions occurring on s390(x) and with the sanitizer. These were caused, because when taking the array specs from the source=-expression also its attributes, like coarray state and so on where taken from there. This additionally added a corank to local objects to allocate, that were no coarrays overwriting data in the array handle. The attached patch fixes both issues. The patch for gcc-5 is not affected, because in gcc-5 the feature of taking the array spec from the source=-expression is not implemented. Bootstrapped and regtested ok on x86_64-linux-gnu/F23. Ok for trunk? Regards, Andre On Tue, 2 Feb 2016 19:24:46 +0100 Paul Richard Thomas wrote: > Hi Andre, > > This looks to be OK for trunk. > > I'll move to the 5-branch patch right away. > > Thanks > > Paul > > On 29 January 2016 at 19:17, 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 > > > diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 2ff2833..649b80f 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -5401,17 +5401,8 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, if (!retrieve_last_ref (&ref, &prev_ref)) return false; - if (ref->u.ar.type == AR_FULL && expr3 != NULL) - { - /* F08:C633: Array shape from expr3. */ - ref = expr3->ref; - - /* Find the last reference in the chain. */ - if (!retrieve_last_ref (&ref, &prev_ref)) - return false; - alloc_w_e3_arr_spec = true; - } - + /* Take the allocatable and coarray properties solely from the expr-ref's + attributes and not from source=-expression. */ if (!prev_ref) { allocatable = expr->symtree->n.sym->attr.allocatable; @@ -5428,6 +5419,17 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, if (!dimension) gcc_assert (coarray); + if (ref->u.ar.type == AR_FULL && expr3 != NULL) + { + /* F08:C633: Array shape from expr3. */ + ref = expr3->ref; + + /* Find the last reference in the chain. */ + if (!retrieve_last_ref (&ref, &prev_ref)) + return false; + alloc_w_e3_arr_spec = true; + } + /* Figure out the size of the array. */ switch (ref->u.ar.type) { @@ -5463,7 +5465,8 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, gfc_init_block (&set_descriptor_block); size = gfc_array_init_size (se->expr, alloc_w_e3_arr_spec ? expr->rank : ref->u.ar.as->rank, - ref->u.ar.as->corank, &offset, lower, upper, + coarray ? ref->u.ar.as->corank : 0, + &offset, lower, upper, &se->pre, &set_descriptor_block, &overflow, expr3_elem_size, nelems, expr3, e3_arr_desc, e3_is_array_constr, expr); diff --git a/gcc/testsuite/gfortran.dg/coarray_allocate_5.f08 b/gcc/testsuite/gfortran.dg/coarray_allocate_5.f08 new file mode 100644 index 0000000..feb1bf3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_allocate_5.f08 @@ -0,0 +1,32 @@ +! { dg-do run } +! { dg-options "-fcoarray=lib -lcaf_single -fdump-tree-original" } +! +! 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 + +! Check that some_local_object is treated as rank-1 array. +! This failed beforehand, because the coarray attribute of the source=expression +! was propagated to some_local_object in the allocate. +! { dg-final { scan-tree-dump-not "some_local_object\._data\.dim\[1\]\.lbound" "original" } }