From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailrelay.tugraz.at (mailrelay.tugraz.at [129.27.2.202]) by sourceware.org (Postfix) with ESMTPS id 84D4C3858D35 for ; Sun, 30 Apr 2023 20:04:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 84D4C3858D35 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=tugraz.at Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tugraz.at Received: from vra-173-11.tugraz.at (vra-173-11.tugraz.at [129.27.173.11]) by mailrelay.tugraz.at (Postfix) with ESMTPSA id 4Q8ckT6Wg9z1LLyL; Sun, 30 Apr 2023 22:04:33 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 mailrelay.tugraz.at 4Q8ckT6Wg9z1LLyL DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tugraz.at; s=mailrelay; t=1682885074; bh=ZEXRYXCW0BuZ8x+l3cIXSEIPG0lm7UMukAdIbjRwqUU=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=O1QTf4ZVtIDlkhGEewAJdPQQ9/go/76a6se6vLKtmUOHXIwSutZn+ky1yDvxxiGtB uwSEy0yddo2YTk2nSjAPIlmp9padu+dXHU8/Hn65Ch/2Z6p9unPbrqttoqZ87Vq+u5 GGslXoXgLEWJu8JDcuGTE7iUq2yQeJ8ZUjGd9Jh8= Message-ID: <138980e7e8d2e3cf3e8352ce47cfe347d3a5f7c7.camel@tugraz.at> Subject: PING [C PATCH - backport 12] Fix ICE related to implicit access attributes for VLA arguments [PR105660] From: Martin Uecker To: gcc-patches@gcc.gnu.org Cc: Richard Biener , jeffreyalaw@gmail.com Date: Sun, 30 Apr 2023 22:04:33 +0200 In-Reply-To: <0e53db562bf15313f7eb8fe31d2c1ed2156b76b0.camel@tugraz.at> References: <0e53db562bf15313f7eb8fe31d2c1ed2156b76b0.camel@tugraz.at> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.3-1+deb11u1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TUG-Backscatter-control: G/VXY7/6zeyuAY/PU2/0qw X-Spam-Scanner: SpamAssassin 3.003001 X-Spam-Score-relay: -1.9 X-Scanned-By: MIMEDefang 2.74 on 129.27.10.117 X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Ok for 12.3 ? Am Mittwoch, dem 19.04.2023 um 18:39 +0200 schrieb Martin Uecker: > Ok to cherrypick for 12? It is in GCC 13 and fixes an > annoying ICE. > > Martin > > > > Here is a fix for PR105660. > > Bootstrapped and regression tested on x86-64. > > >     Fix ICE related to implicit access attributes for VLA arguments [PR105660] >      > >     When constructing the specifier string when merging an access attribute >     that encodes information about VLA arguments, the string was constructed >     in random order by iterating through a hash table. Fix this by iterating >     though the list of arguments. >      > >     PR c/105660 >      > >     gcc/Changelog >             * c-family/c-attribs.cc (append_access_attr): Use order >             of arguments when construction string. >             (append_access_attr_idxs): Rename and make static. >             * c-familty/c-warn.cc (warn_parm_array_mismatch): Add assertion. >      > >     gcc/testsuite/ChangeLog: >             * gcc.dg/pr105660-1.c: New test. >             * gcc.dg/pr105660-2.c: New test. > > > diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc > index 4667f6de311..072cfb69147 100644 > --- a/gcc/c-family/c-attribs.cc > +++ b/gcc/c-family/c-attribs.cc > @@ -4728,22 +4728,27 @@ append_access_attr (tree node[3], tree attrs, const char *attrstr, >    rdwr_map cur_idxs; >    init_attr_rdwr_indices (&cur_idxs, attrs); >   > > + tree args = TYPE_ARG_TYPES (node[0]); > + int argpos = 0; >    std::string spec; > - for (auto it = new_idxs.begin (); it != new_idxs.end (); ++it) > + for (tree arg = args; arg; arg = TREE_CHAIN (arg), argpos++) >      { > - const auto &newaxsref = *it; > + const attr_access* const newa = new_idxs.get (argpos); > + > + if (!newa) > + continue; >   > >        /* The map has two equal entries for each pointer argument that >   has an associated size argument. Process just the entry for >   the former. */ > - if ((unsigned)newaxsref.first != newaxsref.second.ptrarg) > + if ((unsigned)argpos != newa->ptrarg) >   continue; >   > > - const attr_access* const cura = cur_idxs.get (newaxsref.first); > + const attr_access* const cura = cur_idxs.get (argpos); >        if (!cura) >   { >   /* The new attribute needs to be added. */ > - tree str = newaxsref.second.to_internal_string (); > + tree str = newa->to_internal_string (); >   spec += TREE_STRING_POINTER (str); >   continue; >   } > @@ -4751,7 +4756,6 @@ append_access_attr (tree node[3], tree attrs, const char *attrstr, >        /* The new access spec refers to an array/pointer argument for >   which an access spec already exists. Check and diagnose any >   conflicts. If no conflicts are found, merge the two. */ > - const attr_access* const newa = &newaxsref.second; >   > >        if (!attrstr) >   { > @@ -4886,7 +4890,7 @@ append_access_attr (tree node[3], tree attrs, const char *attrstr, >   continue; >   > >        /* Merge the CURA and NEWA. */ > - attr_access merged = newaxsref.second; > + attr_access merged = *newa; >   > >        /* VLA seen in a declaration takes precedence. */ >        if (cura->minsize == HOST_WIDE_INT_M1U) > @@ -4912,9 +4916,9 @@ append_access_attr (tree node[3], tree attrs, const char *attrstr, >   > >  /* Convenience wrapper for the above. */ >   > > -tree > -append_access_attr (tree node[3], tree attrs, const char *attrstr, > - char code, HOST_WIDE_INT idxs[2]) > +static tree > +append_access_attr_idxs (tree node[3], tree attrs, const char *attrstr, > + char code, HOST_WIDE_INT idxs[2]) >  { >    char attrspec[80]; >    int n = sprintf (attrspec, "%c%u", code, (unsigned) idxs[0] - 1); > @@ -5204,7 +5208,7 @@ handle_access_attribute (tree node[3], tree name, tree args, int flags, >       attributes specified on previous declarations of the same type >       and if not, concatenate the two. */ >    const char code = attr_access::mode_chars[mode]; > - tree new_attrs = append_access_attr (node, attrs, attrstr, code, idxs); > + tree new_attrs = append_access_attr_idxs (node, attrs, attrstr, code, idxs); >    if (!new_attrs) >      return NULL_TREE; >   > > @@ -5217,7 +5221,7 @@ handle_access_attribute (tree node[3], tree name, tree args, int flags, >      { >        /* Repeat for the previously declared type. */ >        attrs = TYPE_ATTRIBUTES (TREE_TYPE (node[1])); > - new_attrs = append_access_attr (node, attrs, attrstr, code, idxs); > + new_attrs = append_access_attr_idxs (node, attrs, attrstr, code, idxs); >        if (!new_attrs) >   return NULL_TREE; >   > > diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc > index 29efce3f2c0..a6fb95b1e80 100644 > --- a/gcc/c-family/c-warn.cc > +++ b/gcc/c-family/c-warn.cc > @@ -3617,6 +3617,8 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms) >        for (tree newvbl = newa->size, curvbl = cura->size; newvbl; >   newvbl = TREE_CHAIN (newvbl), curvbl = TREE_CHAIN (curvbl)) >   { > + gcc_assert (curvbl); > + >   tree newpos = TREE_PURPOSE (newvbl); >   tree curpos = TREE_PURPOSE (curvbl); >   > > diff --git a/gcc/testsuite/gcc.dg/pr105660-1.c b/gcc/testsuite/gcc.dg/pr105660-1.c > new file mode 100644 > index 00000000000..d4454f04c43 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr105660-1.c > @@ -0,0 +1,13 @@ > +/* PR105660 > + * { dg-do compile } > + * { dg-options "-std=c17" } > + */ > + > +void gatherConservativeVars(int, int, int, int, int, int, int Hnvar, int, > + int Hnyt, int Hnxyt, int, int Hstep, double[Hnyt], > + double[Hnvar][Hstep][Hnxyt]); > +void gatherConservativeVars(int, int, int, int, int, int, int Hnvar, int, int Hnyt, > + int Hnxyt, int, int Hstep, double[Hnyt], > + double[Hnvar][Hstep][Hnxyt]); > + > + > diff --git a/gcc/testsuite/gcc.dg/pr105660-2.c b/gcc/testsuite/gcc.dg/pr105660-2.c > new file mode 100644 > index 00000000000..29fd82f923b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr105660-2.c > @@ -0,0 +1,12 @@ > +/* PR105660 > + * { dg-do compile } > + * { dg-options "-Wall -std=c17" } > + */ > + > + > +struct bat_gen_conf_s; > +void batch_generator_create2(struct bat_gen_conf_s* config, int D, int N, const long bat_dims[D][N], const long tot_dims[D][N], const long tot_strs[D][N], const _Complex float* data[D]); > +void batch_generator_create2(struct bat_gen_conf_s* config, int D, int N, const long bat_dims[D][N], const long tot_dims[D][N], const long tot_strs[D][N], const _Complex float* data[D]); > + > + > + > >