This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C++ PATCH for 3.3] Fix PR13262 regression (static member init accesschecking)


This is the version for 3.3.

--Kriang


2003-12-15  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/13262
	* pt.c (instantiate_decl): Wrap push_nested_class and
	pop_nested_class around cp_finish_decl call for static member
	variable.

2003-12-15  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/13262
	* g++.dg/template/access13.C: New test.


diff -cprN gcc-33-save/gcc/cp/pt.c gcc-33-new/gcc/cp/pt.c
*** gcc-33-save/gcc/cp/pt.c	Sun Dec  7 18:02:17 2003
--- gcc-33-new/gcc/cp/pt.c	Fri Dec 12 22:17:49 2003
*************** instantiate_decl (d, defer_ok)
*** 10484,10493 ****
--- 10484,10503 ----
  	  /* Mark D as instantiated so that recursive calls to
  	     instantiate_decl do not try to instantiate it again.  */
  	  DECL_TEMPLATE_INSTANTIATED (d) = 1;
+ 	  /* This is done in analogous to `start_decl'.  It is
+ 	     required for correct access checking.  */
+ 	  push_nested_class (DECL_CONTEXT (d), 2);
  	  cp_finish_decl (d, 
  			  (!DECL_INITIALIZED_IN_CLASS_P (d) 
  			   ? DECL_INITIAL (d) : NULL_TREE),
  			  NULL_TREE, 0);
+ 	  /* Normally, pop_nested_class is called by cp_finish_decl
+ 	     above.  But when instantiate_decl is triggered during
+ 	     instantiate_class_template processing, its DECL_CONTEXT
+ 	     is still not completed yet, and pop_nested_class isn't
+ 	     called.  */
+ 	  if (!COMPLETE_TYPE_P (DECL_CONTEXT (d)))
+ 	    pop_nested_class ();
  	}
      }
    else if (TREE_CODE (d) == FUNCTION_DECL)
diff -cprN gcc-33-save/gcc/testsuite/g++.dg/template/access13.C gcc-33-new/gcc/testsuite/g++.dg/template/access13.C
*** gcc-33-save/gcc/testsuite/g++.dg/template/access13.C	Thu Jan  1 07:00:00 1970
--- gcc-33-new/gcc/testsuite/g++.dg/template/access13.C	Sun Dec  7 18:30:50 2003
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile }
+ 
+ // Origin: Francesco Monica <fmonica@ce.unipr.it>
+ 
+ // PR c++/13262: Access checking during instantiation of static data
+ // member.
+ 
+ template <typename T> class Aclass {
+   private:
+     Aclass() {}
+     static Aclass instance;
+ };
+ 
+ template <typename T> Aclass<T> Aclass<T>::instance;
+ 
+ template class Aclass<int>;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]