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 <ja...@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