2004-12-13 Mark Mitchell <mark@codesourcery.com>
PR c++/18925
* class.c (layout_class_type): Determine the visibility of static
data members.
* g++.dg/ext/visibility/staticdatamem.C: New test.
--- gcc/cp/class.c 8 Dec 2004 08:35:33 -0000 1.692
+++ gcc/cp/class.c 14 Dec 2004 02:21:46 -0000 1.693
@@ -4553,7 +4553,13 @@ layout_class_type (tree t, tree *virtual
At this point, finish_record_layout will be called, but
S1 is still incomplete.) */
if (TREE_CODE (field) == VAR_DECL)
- maybe_register_incomplete_var (field);
+ {
+ maybe_register_incomplete_var (field);
+ /* The visibility of static data members is determined
+ at their point of declaration, not their point of
+ definition. */
+ determine_visibility (field);
+ }
continue;
}
--- gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C 1 Jan 1970 00:00:00 -0000
+++ gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C 14 Dec 2004 02:15:55 -0000 1.1
@@ -0,0 +1,20 @@
+// PR c++/18925
+// { dg-do compile { target ia64-*-linux* } }
+// { dg-options "-fPIC -fvisibility=hidden" }
+// { dg-final { scan-assembler-not "gprel" } }
+
+class __attribute__ ((visibility("default"))) Type
+{
+ private:
+ static long _staticTypeCount;
+ public:
+ Type() { _staticTypeCount++; }
+ ~Type();
+};
+
+long Type::_staticTypeCount = 0;
+
+Type::~Type()
+{
+ _staticTypeCount--;
+}