Blob Blame History Raw
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--; 
+}