public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10647] c++: Fix apply_identity_attributes [PR102548]
@ 2022-05-10  8:21 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-05-10  8:21 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:8a4f93b2b0b91aa7ebee9ae89471a7623aca7508

commit r10-10647-g8a4f93b2b0b91aa7ebee9ae89471a7623aca7508
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Oct 5 22:28:38 2021 +0200

    c++: Fix apply_identity_attributes [PR102548]
    
    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.
    
    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.
    
    (cherry picked from commit 737f95bab557584d876f02779ab79fe3cfaacacf)

Diff:
---
 gcc/cp/tree.c                            |  4 ++--
 gcc/testsuite/g++.target/i386/pr102548.C | 12 ++++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 10b818d1370..10d63898324 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1450,9 +1450,9 @@ apply_identity_attributes (tree result, tree attribs, bool *remove_attributes)
 	      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);
diff --git a/gcc/testsuite/g++.target/i386/pr102548.C b/gcc/testsuite/g++.target/i386/pr102548.C
new file mode 100644
index 00000000000..e1238c3f904
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr102548.C
@@ -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;
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-10  8:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-10  8:21 [gcc r10-10647] c++: Fix apply_identity_attributes [PR102548] Jakub Jelinek

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).