From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20459 invoked by alias); 5 Oct 2016 20:41:02 -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 20269 invoked by uid 89); 5 Oct 2016 20:40:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=no version=3.3.2 spammy=H*c:sk:001a113, concrete, technically, sbuf X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-oi0-f67.google.com Received: from mail-oi0-f67.google.com (HELO mail-oi0-f67.google.com) (209.85.218.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 05 Oct 2016 20:40:52 +0000 Received: by mail-oi0-f67.google.com with SMTP id r132so12990967oig.1; Wed, 05 Oct 2016 13:40:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=KqZlEj+rpXDL/HVFBhNX5RwDrj6rv0h4PyqUwfgHzSA=; b=ImTtbIocIv4PflhVm5zcYDwYt6TSFvGd3iI2qBDXwJiH70pQxJO/3SVeS+u+pj4N3Q qfWMD+640+kvejivZOySwRMlnqXLZF0ttkhNzSELLUjG/fE9jvK0rqXrawFDrSCWtNiv gqF36DmcjGe9HeAXLnY6IsUEdmyJKomeZQsgbKq3KsgGXMDwOrksl3mO7/0sBh5Wf3JJ bp4HCBorbJtiX34DfVqLamMwUv/h6MYEPDrIswqdoPKPWLzMiUhGIm7Tb0cnap6p2qg1 OQhgAu1vRgFB3qSqMG7NJFKuNhoe5zANCbCupb+97f27R7iNZnw/GMkztuVuuOaI9T8k 0dRQ== X-Gm-Message-State: AA6/9Rk4CtfhwporDNFRoJJzaBPjP3wKDiqWp480S6wEYDlen+UdwiNgnTiTBjwBWThQXMX4I8DtjLrAEuA6Sg== X-Received: by 10.157.20.206 with SMTP id r14mr6725508otr.226.1475700050753; Wed, 05 Oct 2016 13:40:50 -0700 (PDT) MIME-Version: 1.0 Received: by 10.182.80.166 with HTTP; Wed, 5 Oct 2016 13:40:50 -0700 (PDT) From: Fritz Reese Date: Wed, 05 Oct 2016 20:41:00 -0000 Message-ID: Subject: Fix ICE due to map typespecs with different sized charlens being copied To: gcc-patches , fortran Content-Type: multipart/mixed; boundary=001a11372c4c524db9053e24313f X-SW-Source: 2016-10/txt/msg00325.txt.bz2 --001a11372c4c524db9053e24313f Content-Type: text/plain; charset=UTF-8 Content-length: 3929 When union type symbols are compared and they contain maps containing characters with different lengths, their type symbols should have different backend declarations otherwise the gimple tree explodes. Strangely enough the gimple checker only explodes with '-g' enabled and certain other specific conditions, however the problem seems clear. See the attached testcase for an example, and the attached patch for a fix. RFC: My only concern is that this patch would technically also change the way components are compared between derived types and class types, not just union/map types. However from what I can tell if two derived types are declared with character components of different lengths then the two types should have distinct backend declarations anyway. If anyone can think of any issues this patch might cause with derived types/class types then I'd be okay guarding the new if statement to only run for union/structure types. But with all my tests it doesn't seem to result in any concrete differences. The patch does pass all regression tests on x86_64-redhat-linux. I will give it a couple days for the RFC before committing. --- Fritz Reese 2016-10-05 Fritz Reese Fix ICE due to map typespecs with different sized charlens being copied. * gcc/fortran/interface.c (compare_components): Check charlens. * gcc/testsuite/gfortran.dg/dec_union_11.f90: New testcase. diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index e7f1878..17f544e 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -495,6 +495,17 @@ compare_components (gfc_component *cmp1, gfc_component *cmp2, if (cmp1->attr.dimension && gfc_compare_array_spec (cmp1->as, cmp2->as) == 0) return 0; + if (cmp1->ts.type == BT_CHARACTER && cmp2->ts.type == BT_CHARACTER) + { + gfc_charlen *l1 = cmp1->ts.u.cl; + gfc_charlen *l2 = cmp2->ts.u.cl; + if (l1 && l2 && l1->length && l2->length + && l1->length->expr_type == EXPR_CONSTANT + && l2->length->expr_type == EXPR_CONSTANT + && gfc_dep_compare_expr (l1->length, l2->length) != 0) + return 0; + } + /* Make sure that link lists do not put this function into an endless recursive loop! */ if (!(cmp1->ts.type == BT_DERIVED && derived1 == cmp1->ts.u.derived) diff --git a/gcc/testsuite/gfortran.dg/dec_union_11.f90 b/gcc/testsuite/gfortran.dg/dec_union_11.f90 new file mode 100644 index 0000000..3ff4b49 diff --git a/gcc/testsuite/gfortran.dg/dec_union_11.f90 b/gcc/testsuite/gfortran.dg/dec_union_11.f90 new file mode 100644 index 0000000..3ff4b49 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_union_11.f90 @@ -0,0 +1,63 @@ +! { dg-do compile } +! { dg-options "-g -fdec-structure" } +! +! Test a regression where typespecs of unions containing character buffers of +! different lengths where copied, resulting in a bad gimple tree state. +! + +subroutine sub2 (otherbuf) + integer, parameter :: L_bbuf = 65536 + integer, parameter :: L_bbuf2 = 24 + + structure /buffer2/ + union + map + character(L_bbuf2) sbuf + end map + end union + end structure + structure /buffer/ + union + map + character(L_bbuf) sbuf + end map + end union + end structure + + record /buffer/ buf1 + record /buffer2/ buf2 + common /c/ buf1, buf2 + + record /buffer2/ otherbuf +end subroutine + +subroutine sub() + integer, parameter :: L_bbuf = 65536 + integer, parameter :: L_bbuf2 = 24 + + structure /buffer2/ + union + map + character(L_bbuf2) sbuf + end map + end union + end structure + structure /buffer/ + union + map + character(L_bbuf) sbuf + end map + end union + end structure + + record /buffer/ buf1 + record /buffer2/ buf2 + common /c/ buf1, buf2 + + call sub2 (buf1) ! { dg-warning "Type mismatch" } + return +end subroutine + +call sub() + +end --001a11372c4c524db9053e24313f Content-Type: text/x-patch; charset=US-ASCII; name="comp_charlen.patch" Content-Disposition: attachment; filename="comp_charlen.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_itxdpa050 Content-length: 3185 ZGlmZiAtLWdpdCBhL2djYy9mb3J0cmFuL2ludGVyZmFjZS5jIGIvZ2NjL2Zv cnRyYW4vaW50ZXJmYWNlLmMKaW5kZXggZTdmMTg3OC4uMTdmNTQ0ZSAxMDA2 NDQKLS0tIGEvZ2NjL2ZvcnRyYW4vaW50ZXJmYWNlLmMKKysrIGIvZ2NjL2Zv cnRyYW4vaW50ZXJmYWNlLmMKQEAgLTQ5NSw2ICs0OTUsMTcgQEAgY29tcGFy ZV9jb21wb25lbnRzIChnZmNfY29tcG9uZW50ICpjbXAxLCBnZmNfY29tcG9u ZW50ICpjbXAyLAogICBpZiAoY21wMS0+YXR0ci5kaW1lbnNpb24gJiYgZ2Zj X2NvbXBhcmVfYXJyYXlfc3BlYyAoY21wMS0+YXMsIGNtcDItPmFzKSA9PSAw KQogICAgIHJldHVybiAwOwogCisgIGlmIChjbXAxLT50cy50eXBlID09IEJU X0NIQVJBQ1RFUiAmJiBjbXAyLT50cy50eXBlID09IEJUX0NIQVJBQ1RFUikK KyAgICB7CisgICAgICBnZmNfY2hhcmxlbiAqbDEgPSBjbXAxLT50cy51LmNs OworICAgICAgZ2ZjX2NoYXJsZW4gKmwyID0gY21wMi0+dHMudS5jbDsKKyAg ICAgIGlmIChsMSAmJiBsMiAmJiBsMS0+bGVuZ3RoICYmIGwyLT5sZW5ndGgK KyAgICAgICAgICAmJiBsMS0+bGVuZ3RoLT5leHByX3R5cGUgPT0gRVhQUl9D T05TVEFOVAorICAgICAgICAgICYmIGwyLT5sZW5ndGgtPmV4cHJfdHlwZSA9 PSBFWFBSX0NPTlNUQU5UCisgICAgICAgICAgJiYgZ2ZjX2RlcF9jb21wYXJl X2V4cHIgKGwxLT5sZW5ndGgsIGwyLT5sZW5ndGgpICE9IDApCisgICAgICAg IHJldHVybiAwOworICAgIH0KKwogICAvKiBNYWtlIHN1cmUgdGhhdCBsaW5r IGxpc3RzIGRvIG5vdCBwdXQgdGhpcyBmdW5jdGlvbiBpbnRvIGFuCiAgICAg IGVuZGxlc3MgcmVjdXJzaXZlIGxvb3AhICAqLwogICBpZiAoIShjbXAxLT50 cy50eXBlID09IEJUX0RFUklWRUQgJiYgZGVyaXZlZDEgPT0gY21wMS0+dHMu dS5kZXJpdmVkKQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJh bi5kZy9kZWNfdW5pb25fMTEuZjkwIGIvZ2NjL3Rlc3RzdWl0ZS9nZm9ydHJh bi5kZy9kZWNfdW5pb25fMTEuZjkwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjNmZjRiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9nY2Mv dGVzdHN1aXRlL2dmb3J0cmFuLmRnL2RlY191bmlvbl8xMS5mOTAKQEAgLTAs MCArMSw2MyBAQAorISB7IGRnLWRvIGNvbXBpbGUgfQorISB7IGRnLW9wdGlv bnMgIi1nIC1mZGVjLXN0cnVjdHVyZSIgfQorIQorISBUZXN0IGEgcmVncmVz c2lvbiB3aGVyZSB0eXBlc3BlY3Mgb2YgdW5pb25zIGNvbnRhaW5pbmcgY2hh cmFjdGVyIGJ1ZmZlcnMgb2YKKyEgZGlmZmVyZW50IGxlbmd0aHMgd2hlcmUg Y29waWVkLCByZXN1bHRpbmcgaW4gYSBiYWQgZ2ltcGxlIHRyZWUgc3RhdGUu CishCisKK3N1YnJvdXRpbmUgc3ViMiAob3RoZXJidWYpCisgIGludGVnZXIs IHBhcmFtZXRlciA6OiBMX2JidWYgPSA2NTUzNgorICBpbnRlZ2VyLCBwYXJh bWV0ZXIgOjogTF9iYnVmMiA9IDI0CisKKyAgc3RydWN0dXJlIC9idWZmZXIy LworICAgIHVuaW9uCisgICAgIG1hcAorICAgICAgY2hhcmFjdGVyKExfYmJ1 ZjIpICBzYnVmCisgICAgIGVuZCBtYXAKKyAgICBlbmQgdW5pb24KKyAgZW5k IHN0cnVjdHVyZQorICBzdHJ1Y3R1cmUgL2J1ZmZlci8KKyAgICB1bmlvbgor ICAgICBtYXAKKyAgICAgIGNoYXJhY3RlcihMX2JidWYpICBzYnVmCisgICAg IGVuZCBtYXAKKyAgICBlbmQgdW5pb24KKyAgZW5kIHN0cnVjdHVyZQorCisg IHJlY29yZCAvYnVmZmVyLyBidWYxCisgIHJlY29yZCAvYnVmZmVyMi8gYnVm MgorICBjb21tb24gL2MvIGJ1ZjEsIGJ1ZjIKKworICByZWNvcmQgL2J1ZmZl cjIvIG90aGVyYnVmCitlbmQgc3Vicm91dGluZQorCitzdWJyb3V0aW5lIHN1 YigpCisgIGludGVnZXIsIHBhcmFtZXRlciA6OiBMX2JidWYgPSA2NTUzNgor ICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogTF9iYnVmMiA9IDI0CisKKyAgc3Ry dWN0dXJlIC9idWZmZXIyLworICAgIHVuaW9uCisgICAgIG1hcAorICAgICAg Y2hhcmFjdGVyKExfYmJ1ZjIpICBzYnVmCisgICAgIGVuZCBtYXAKKyAgICBl bmQgdW5pb24KKyAgZW5kIHN0cnVjdHVyZQorICBzdHJ1Y3R1cmUgL2J1ZmZl ci8KKyAgICB1bmlvbgorICAgICBtYXAKKyAgICAgIGNoYXJhY3RlcihMX2Ji dWYpICBzYnVmCisgICAgIGVuZCBtYXAKKyAgICBlbmQgdW5pb24KKyAgZW5k IHN0cnVjdHVyZQorCisgIHJlY29yZCAvYnVmZmVyLyBidWYxCisgIHJlY29y ZCAvYnVmZmVyMi8gYnVmMgorICBjb21tb24gL2MvIGJ1ZjEsIGJ1ZjIKKwor ICBjYWxsIHN1YjIgKGJ1ZjEpICEgeyBkZy13YXJuaW5nICJUeXBlIG1pc21h dGNoIiB9CisgIHJldHVybgorZW5kIHN1YnJvdXRpbmUKKworY2FsbCBzdWIo KQorCitlbmQK --001a11372c4c524db9053e24313f--