This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Avoid ICE due to the attribute exclusion additions (PR c++/83322)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>, Nathan Sidwell <nathan at acm dot org>, Martin Sebor <msebor at gmail dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 12 Dec 2017 20:01:24 +0100
- Subject: [C++ PATCH] Avoid ICE due to the attribute exclusion additions (PR c++/83322)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
This patch avoids ICEs when last_decl isn't a decl.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Though, I believe it would be better to do the attribute exclusions check
in duplicate_decls instead if the attributes don't appear together already
on a single decl, instead of trying to do another lookup. I've filed a PR
where it makes a difference.
2017-12-12 Jakub Jelinek <jakub@redhat.com>
PR c++/83322
* decl2.c (cplus_decl_attributes): If last_decl is BASELINK, use
BASELINK_FUNCTIONS. If after OVERLOAD checking last_decl isn't
a decl, clear it.
* g++.dg/warn/pr83322.C: New test.
--- gcc/cp/decl2.c.jj 2017-12-07 18:04:58.000000000 +0100
+++ gcc/cp/decl2.c 2017-12-12 15:40:33.634654947 +0100
@@ -1486,6 +1486,9 @@ cplus_decl_attributes (tree *decl, tree
tree last_decl = (DECL_P (*decl) && DECL_NAME (*decl)
? lookup_name (DECL_NAME (*decl)) : NULL_TREE);
+ if (last_decl && BASELINK_P (last_decl))
+ last_decl = BASELINK_FUNCTIONS (last_decl);
+
if (last_decl && TREE_CODE (last_decl) == OVERLOAD)
for (ovl_iterator iter (last_decl, true); ; ++iter)
{
@@ -1504,6 +1507,8 @@ cplus_decl_attributes (tree *decl, tree
break;
}
}
+ if (last_decl && !DECL_P (last_decl))
+ last_decl = NULL_TREE;
decl_attributes (decl, attributes, flags, last_decl);
}
--- gcc/testsuite/g++.dg/warn/pr83322.C.jj 2017-12-12 15:40:01.054047913 +0100
+++ gcc/testsuite/g++.dg/warn/pr83322.C 2017-12-12 15:39:13.000000000 +0100
@@ -0,0 +1,8 @@
+// PR c++/83322
+// { dg-do compile }
+// { dg-options "" }
+
+struct A {
+ template <class T> operator T ();
+ __attribute__((__always_inline__)) operator int ();
+};
Jakub