From: jason Date: Thu, 1 Mar 2012 17:52:12 +0000 (+0000) Subject: PR c++/51930 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=ce6ea84778178a6db62b5f2ace8798ba8ba98d8d PR c++/51930 * decl.c (check_tag_decl): Move warning for misplaced attributes here. (shadow_tag): From here. * parser.c (cp_parser_explicit_instantiation): Don't warn here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184753 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2c81a8a4119..6a92eeba555 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-02-29 Jason Merrill + + PR c++/51930 + * decl.c (check_tag_decl): Move warning for misplaced attributes here. + (shadow_tag): From here. + * parser.c (cp_parser_explicit_instantiation): Don't warn here. + 2012-02-21 Jakub Jelinek PR c++/52312 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2a6a5160fb6..c47f87c3032 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4216,6 +4216,19 @@ check_tag_decl (cp_decl_specifier_seq *declspecs) error ("% cannot be used for type declarations"); } + if (declspecs->attributes) + { + location_t loc = input_location; + if (!CLASSTYPE_TEMPLATE_INSTANTIATION (declared_type)) + /* For a non-template class, use the name location; for a template + class (an explicit instantiation), use the current location. */ + input_location = location_of (declared_type); + warning (0, "attribute ignored in declaration of %q#T", declared_type); + warning (0, "attribute for %q#T must follow the %qs keyword", + declared_type, class_key_or_enum_as_string (declared_type)); + input_location = loc; + } + return declared_type; } @@ -4240,14 +4253,6 @@ shadow_tag (cp_decl_specifier_seq *declspecs) if (!t) return NULL_TREE; - if (declspecs->attributes) - { - warning (0, "attribute ignored in declaration of %q+#T", t); - warning (0, "attribute for %q+#T must follow the %qs keyword", - t, class_key_or_enum_as_string (t)); - - } - if (maybe_process_partial_specialization (t) == error_mark_node) return NULL_TREE; diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 3e2be97f9c9..491f48e0fcc 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13122,9 +13122,6 @@ cp_parser_explicit_instantiation (cp_parser* parser) tree type; type = check_tag_decl (&decl_specifiers); - if (decl_specifiers.attributes) - warning (OPT_Wattributes, - "attributes ignored on explicit type instantiation"); /* Turn access control back on for names used during template instantiation. */ pop_deferring_access_checks (); diff --git a/gcc/testsuite/g++.dg/ext/attrib43.C b/gcc/testsuite/g++.dg/ext/attrib43.C index fe9f0727cf6..acae3f23c90 100644 --- a/gcc/testsuite/g++.dg/ext/attrib43.C +++ b/gcc/testsuite/g++.dg/ext/attrib43.C @@ -2,4 +2,4 @@ template struct A { }; template __attribute__ ((packed)) -struct A; // { dg-warning "attributes ignored" } +struct A; // { dg-warning "attribute" }