[C++ PATCH] Fix PR7639

Kriang Lerdsuwanakij lerdsuwa@users.sourceforge.net
Wed Oct 23 08:26:00 GMT 2002


Hi

The patch below fixes a main-trunk regression introduced in the
major build_component_ref overhaul.  In build_class_member_access_expr
we only check if the class is complete.  But we forget to check
that the member data we are accessing is also complete as well.
Note that in instantiate_class_template, we treat a class as
completed even though some of its field may be incomplete (in pt.c
about line number 5390).

Bootstrapped and tested on i686-pc-linux-gnu with no regressions.
OK to commit to the trunk?

--Kriang


2002-10-23  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	* typeck.c (build_class_member_access_expr): When accessing a
	member data, make sure it is complete.

2002-10-23  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>

	PR c++/7639
	* g++.dg/template/instantiate3.C: New test.


diff -cprN gcc-main-save/gcc/cp/typeck.c gcc-main-new/gcc/cp/typeck.c
*** gcc-main-save/gcc/cp/typeck.c	Thu Oct  3 21:48:34 2002
--- gcc-main-new/gcc/cp/typeck.c	Wed Oct 23 21:18:34 2002
*************** build_class_member_access_expr (tree obj
*** 1899,1904 ****
--- 1899,1907 ----
        intended.  */
     if (DECL_P (member))
       {
+       if (!complete_type_or_else (TREE_TYPE (member), member))
+ 	return error_mark_node;
+
         member_scope = DECL_CLASS_CONTEXT (member);
         mark_used (member);
         if (TREE_DEPRECATED (member))
diff -cprN gcc-main-save/gcc/testsuite/g++.dg/template/instantiate3.C gcc-main-new/gcc/testsuite/g++.dg/template/instantiate3.C
*** gcc-main-save/gcc/testsuite/g++.dg/template/instantiate3.C	Thu Jan  1 07:00:00 1970
--- gcc-main-new/gcc/testsuite/g++.dg/template/instantiate3.C	Wed Oct 23 21:40:36 2002
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile }
+ // Origin: Scott Snyder <snyder@fnal.gov>
+
+ // PR c++/7639
+ // ICE when accessing member with incomplete type.
+
+ class ACE_Null_Mutex;	// { dg-error "forward declaration" }
+
+ template <class TYPE>
+ struct ACE_Cleanup_Adapter
+ {
+   TYPE &object ()
+   { return object_; }
+   TYPE object_;		// { dg-error "incomplete type" }
+ };
+
+ template class ACE_Cleanup_Adapter<ACE_Null_Mutex>; // { dg-error "instantiated from here" }



More information about the Gcc-patches mailing list