public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: gcc-patches@gcc.gnu.org
Subject: Re: [PATCH] c++: Fix apply_identity_attributes [PR102548]
Date: Tue, 5 Oct 2021 14:47:51 -0400	[thread overview]
Message-ID: <eced3cdb-16ab-1aa3-f3b0-1b39e81c505d@redhat.com> (raw)
In-Reply-To: <20211005075012.GA920498@tucnak>

On 10/5/21 03:50, Jakub Jelinek wrote:
> Hi!
> 
> The following testcase ICEs on x86_64-linux with -m32 due to a bug in
> apply_identity_attributes.  The function is being smart and attempts not
> to duplicate the chain unnecessarily, if either there are no attributes
> that affect type identity or there is possibly empty set of attributes
> that do not affect type identity in the chain followed by attributes
> that do affect type identity, it reuses that attribute chain.
> 
> The function mishandles the cases where in the chain an attribute affects
> type identity and is followed by one or more attributes that don't
> affect type identity (and then perhaps some further ones that do).
> 
> There are two bugs.  One is that when we notice first attribute that
> doesn't affect type identity after first attribute that does affect type
> identity (with perhaps some further such attributes in the chain after it),
> we want to put into the new chain just attributes starting from
> (inclusive) first_ident and up to (exclusive) the current attribute a,
> but the code puts into the chain all attributes starting with first_ident,
> including the ones that do not affect type identity and if e.g. we have
> doesn't0 affects1 doesn't2 affects3 affects4 sequence of attributes, the
> resulting sequence would have
> affects1 doesn't2 affects3 affects4 affects3 affects4
> attributes, i.e. one attribute that shouldn't be there and two attributes
> duplicated.  That is fixed by the a2 -> a2 != a change.
> 
> The second one is that we ICE once we see second attribute that doesn't
> affect type identity after an attribute that affects it.  That is because
> first_ident is set to error_mark_node after handling the first attribute
> that doesn't affect type identity (i.e. after we've copied the
> [first_ident, a) set of attributes to the new chain) to denote that from
> that time on, each attribute that affects type identity should be copied
> whenever it is seen (the if (as && as->affects_type_identity) code does
> that correctly).  But that condition is false and first_ident is
> error_mark_node, we enter else if (first_ident) and use TREE_PURPOSE
> /TREE_VALUE/TREE_CHAIN on error_mark_node, which ICEs.  When
> first_ident is error_mark_node and a doesn't affect type identity,
> we want to do nothing.  So that is the && first_ident != error_mark_node
> chunk.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk
> and release branches?

OK.

> 2021-10-05  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR c++/102548
> 	* tree.c (apply_identity_attributes): Fix handling of the
> 	case where an attribute in the list doesn't affect type
> 	identity but some attribute before it does.
> 
> 	* g++.target/i386/pr102548.C: New test.
> 
> --- gcc/cp/tree.c.jj	2021-10-01 18:06:54.603452541 +0200
> +++ gcc/cp/tree.c	2021-10-04 19:52:28.767457791 +0200
> @@ -1499,9 +1499,9 @@ apply_identity_attributes (tree result,
>   	      p = &TREE_CHAIN (*p);
>   	    }
>   	}
> -      else if (first_ident)
> +      else if (first_ident && first_ident != error_mark_node)
>   	{
> -	  for (tree a2 = first_ident; a2; a2 = TREE_CHAIN (a2))
> +	  for (tree a2 = first_ident; a2 != a; a2 = TREE_CHAIN (a2))
>   	    {
>   	      *p = tree_cons (TREE_PURPOSE (a2), TREE_VALUE (a2), NULL_TREE);
>   	      p = &TREE_CHAIN (*p);
> --- gcc/testsuite/g++.target/i386/pr102548.C.jj	2021-10-04 20:06:19.314810708 +0200
> +++ gcc/testsuite/g++.target/i386/pr102548.C	2021-10-04 20:05:14.808717194 +0200
> @@ -0,0 +1,12 @@
> +// PR c++/102548
> +// { dg-do compile { target { c++14 && ia32 } } }
> +
> +typedef decltype(sizeof(0)) size_t;
> +struct tm;
> +extern "C" size_t __attribute__((__cdecl__)) strftime (char *, size_t, const char *, const struct tm *);
> +
> +auto
> +foo (void)
> +{
> +  return strftime;
> +}
> 
> 	Jakub
> 


      reply	other threads:[~2021-10-05 18:47 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-05  7:50 Jakub Jelinek
2021-10-05 18:47 ` Jason Merrill [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=eced3cdb-16ab-1aa3-f3b0-1b39e81c505d@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).