re PR c++/51930 (Explicitly instantiated template gets hidden visibility)
authorJason Merrill <jason@redhat.com>
Thu, 1 Mar 2012 17:52:12 +0000 (12:52 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 1 Mar 2012 17:52:12 +0000 (12:52 -0500)
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.

From-SVN: r184753

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/parser.c
gcc/testsuite/g++.dg/ext/attrib43.C

index 2c81a8a41197ec81d6600e38530ac910ef6cdeae..6a92eeba555e2df80a3660c64f1d90c979c5d7d2 100644 (file)
@@ -1,3 +1,10 @@
+2012-02-29  Jason Merrill  <jason@redhat.com>
+
+       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  <jakub@redhat.com>
 
        PR c++/52312
index 2a6a5160fb6b6189bc01b03058c66dfd305b399a..c47f87c30324ce7844934521e121da24b96ab693 100644 (file)
@@ -4216,6 +4216,19 @@ check_tag_decl (cp_decl_specifier_seq *declspecs)
         error ("%<constexpr%> 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;
 
index 3e2be97f9c9ed7f86210b436d8f0cfb0cde306b2..491f48e0fcc757d042a9aa910656dc91778c35d4 100644 (file)
@@ -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 ();
index fe9f0727cf6b921b1321ec9113a6a443137971a7..acae3f23c90ca6c45be873e9cb4c9f565a8d71b0 100644 (file)
@@ -2,4 +2,4 @@ template <class T> struct A { };
 
 template
 __attribute__ ((packed))
-struct A<int>;                 // { dg-warning "attributes ignored" }
+struct A<int>;                 // { dg-warning "attribute" }