pt.c (instantiate_class_template_1): If DECL_PRESERVE_P is set on a member function...
authorJason Merrill <jason@redhat.com>
Tue, 16 Aug 2011 23:25:52 +0000 (19:25 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 16 Aug 2011 23:25:52 +0000 (19:25 -0400)
* pt.c (instantiate_class_template_1): If DECL_PRESERVE_P is set
on a member function or static data member, call mark_used.

From-SVN: r177811

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/attr-used-1.C [new file with mode: 0644]

index ea1a8d086e0f13fbcb1cf58a1a57089388b8ab9f..c06a3078e44030e0e886385bdcb21599e1e9219a 100644 (file)
@@ -1,5 +1,8 @@
 2011-08-16  Jason Merrill  <jason@redhat.com>
 
+       * pt.c (instantiate_class_template_1): If DECL_PRESERVE_P is set
+       on a member function or static data member, call mark_used.
+
        PR c++/50054
        * typeck2.c (cxx_incomplete_type_diagnostic): Handle
        init_list_type_node.
index 10fdceda4624d97329988f41bc244bee44563885..9a4419a0783506244c7f86ef861cc84c784ee6c1 100644 (file)
@@ -8675,6 +8675,9 @@ instantiate_class_template_1 (tree type)
                --processing_template_decl;
              set_current_access_from_decl (r);
              finish_member_declaration (r);
+             /* Instantiate members marked with attribute used.  */
+             if (r != error_mark_node && DECL_PRESERVE_P (r))
+               mark_used (r);
            }
          else
            {
@@ -8724,6 +8727,9 @@ instantiate_class_template_1 (tree type)
                         /*init_const_expr_p=*/false,
                         /*asmspec_tree=*/NULL_TREE,
                         /*flags=*/0);
+                     /* Instantiate members marked with attribute used.  */
+                     if (r != error_mark_node && DECL_PRESERVE_P (r))
+                       mark_used (r);
                    }
                  else if (TREE_CODE (r) == FIELD_DECL)
                    {
index 49a81253593af00ecc77cdb460dde031cb2c9a0d..786c18ddae2c8e0d6a81e91ab230b08bb55f0c58 100644 (file)
@@ -3647,6 +3647,10 @@ for the function even if it appears that the function is not referenced.
 This is useful, for example, when the function is referenced only in
 inline assembly.
 
+When applied to a member function of a C++ class template, the
+attribute also means that the function will be instantiated if the
+class itself is instantiated.
+
 @item version_id
 @cindex @code{version_id} attribute
 This IA64 HP-UX attribute, attached to a global variable or function, renames a
@@ -4457,6 +4461,10 @@ variable.
 This attribute, attached to a variable, means that the variable must be
 emitted even if it appears that the variable is not referenced.
 
+When applied to a static data member of a C++ class template, the
+attribute also means that the member will be instantiated if the
+class itself is instantiated.
+
 @item vector_size (@var{bytes})
 This attribute specifies the vector size for the variable, measured in
 bytes.  For example, the declaration:
index 2e56e745e42438ec4e93b95aa89b2cf499f7e0f8..39107f93ee4dd46bc78c0942f9aab622e74b7a6c 100644 (file)
@@ -1,5 +1,7 @@
 2011-08-16  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/ext/attr-used-1.C: New.
+
        PR c++/50054
        * g++.dg/cpp0x/initlist56.C: New.
 
diff --git a/gcc/testsuite/g++.dg/ext/attr-used-1.C b/gcc/testsuite/g++.dg/ext/attr-used-1.C
new file mode 100644 (file)
index 0000000..6754c7f
--- /dev/null
@@ -0,0 +1,17 @@
+// Attribute used on a member function or static data member
+// of a template should cause them to be instantiated along
+// with the class itself.
+
+// { dg-final { scan-assembler "_ZN1AIiE1fEv" } }
+// { dg-final { scan-assembler "_ZN1AIiE1tE" } }
+
+template <class T> struct A
+{
+  void f() __attribute ((used));
+  static T t __attribute ((used));
+};
+
+template <class T> void A<T>::f() { }
+template <class T> T A<T>::t;
+
+A<int> a;