C++ PATCH: PR 25337

Mark Mitchell mark@codesourcery.com
Mon Dec 12 01:45:00 GMT 2005


This patch fixes PR c++/25337, and ICE on valid code.  We were
forgetting that, even after substitution, "a.b" might be dependent;
see the test case attached.

Tested on x86_64-unknown-linux-gnu, applied on the mainline and on the
4.0 and 4.1 branches.

--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com

2005-12-10  Mark Mitchell  <mark@codesourcery.com>

	PR c++/25337 
	* pt.c (tsubst_copy_and_build): Permit dependent types for the
	object in a class member access expression.

2005-12-11  Mark Mitchell  <mark@codesourcery.com>

	PR c++/25337
	* g++.dg/template/defarg7.C: New test.

Index: gcc/cp/pt.c
===================================================================
--- gcc/cp/pt.c	(revision 108374)
+++ gcc/cp/pt.c	(working copy)
@@ -8857,6 +8857,7 @@ tsubst_copy_and_build (tree t,
     case COMPONENT_REF:
       {
 	tree object;
+	tree object_type;
 	tree member;
 
 	object = tsubst_non_call_postfix_expression (TREE_OPERAND (t, 0),
@@ -8864,6 +8865,7 @@ tsubst_copy_and_build (tree t,
 	/* Remember that there was a reference to this entity.  */
 	if (DECL_P (object))
 	  mark_used (object);
+	object_type = TREE_TYPE (object);
 
 	member = TREE_OPERAND (t, 1);
 	if (BASELINK_P (member))
@@ -8872,20 +8874,20 @@ tsubst_copy_and_build (tree t,
 				    args, complain, in_decl);
 	else
 	  member = tsubst_copy (member, args, complain, in_decl);
-
 	if (member == error_mark_node)
 	  return error_mark_node;
-	else if (!CLASS_TYPE_P (TREE_TYPE (object)))
+
+	if (object_type && !CLASS_TYPE_P (object_type))
 	  {
 	    if (TREE_CODE (member) == BIT_NOT_EXPR)
 	      return finish_pseudo_destructor_expr (object,
 						    NULL_TREE,
-						    TREE_TYPE (object));
+						    object_type);
 	    else if (TREE_CODE (member) == SCOPE_REF
 		     && (TREE_CODE (TREE_OPERAND (member, 1)) == BIT_NOT_EXPR))
 	      return finish_pseudo_destructor_expr (object,
 						    object,
-						    TREE_TYPE (object));
+						    object_type);
 	  }
 	else if (TREE_CODE (member) == SCOPE_REF
 		 && TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR)
@@ -8907,12 +8909,11 @@ tsubst_copy_and_build (tree t,
 			      args);
 		member = (adjust_result_of_qualified_name_lookup
 			  (member, BINFO_TYPE (BASELINK_BINFO (member)),
-			   TREE_TYPE (object)));
+			   object_type));
 	      }
 	    else
 	      {
-		qualified_name_lookup_error (TREE_TYPE (object), tmpl,
-					     member);
+		qualified_name_lookup_error (object_type, tmpl, member);
 		return error_mark_node;
 	      }
 	  }
Index: gcc/testsuite/g++.dg/template/defarg7.C
===================================================================
--- gcc/testsuite/g++.dg/template/defarg7.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/defarg7.C	(revision 0)
@@ -0,0 +1,7 @@
+// PR c++/25337
+
+template <typename T> T& MakeT();
+template <typename U, int N = sizeof (MakeT<U>().operator[](0))>
+struct helper{};
+template <typename U>
+static char is_here(helper<U>*);



More information about the Gcc-patches mailing list