Hi! The recent change to move the warning about misplaced attributes resulted in ICE on the following testcase. The problem is that the ENUMERAL_TYPE doesn't have type lang specific initialized and so CLASSTYPE_TEMPLATE_INSTANTIATION macro segfaults. Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.7.1?
2012-03-22 Jakub Jelinek <ja...@redhat.com> PR c++/52671 * decl.c (check_tag_decl): Only use CLASSTYPE_TEMPLATE_INSTANTIATION on CLASS_TYPE_P types. * g++.dg/ext/attrib44.C: New test. --- gcc/cp/decl.c.jj 2012-03-06 17:02:09.000000000 +0100 +++ gcc/cp/decl.c 2012-03-22 17:20:05.744573734 +0100 @@ -4219,7 +4219,8 @@ check_tag_decl (cp_decl_specifier_seq *d if (declspecs->attributes && warn_attributes) { location_t loc; - if (!CLASSTYPE_TEMPLATE_INSTANTIATION (declared_type)) + if (!CLASS_TYPE_P (declared_type) + || !CLASSTYPE_TEMPLATE_INSTANTIATION (declared_type)) /* For a non-template class, use the name location. */ loc = location_of (declared_type); else --- gcc/testsuite/g++.dg/ext/attrib44.C.jj 2012-03-22 17:41:43.469220822 +0100 +++ gcc/testsuite/g++.dg/ext/attrib44.C 2012-03-22 17:41:51.784172016 +0100 @@ -0,0 +1,4 @@ +// PR c++/52671 +// { dg-do compile } +__attribute__ ((deprecated)) enum E { E0 }; // { dg-warning "attribute ignored in declaration of" } +// { dg-message "must follow the" "" { target *-*-* } 3 } Jakub