C++ PATCH for typename

Mark Mitchell mark@codesourcery.com
Fri Apr 16 18:06:00 GMT 1999


Here's another typename patch, this time for the non-implicit variety.

-- 
Mark Mitchell                   mark@codesourcery.com
CodeSourcery, LLC               http://www.codesourcery.com

1999-04-16  Mark Mitchell  <mark@codesourcery.com>

	* class.c (finish_struct): Remove unused variable.
	(pushclass): Likewise.
	(invalidate_class_lookup_cache): Likewise.
	* cp-tree.def (TYPENAME_TYPE): Improve documentation.
	* decl.c (build_typename_type): Make sure TYPENAME_TYPE_FULLNAME
	doesn't get obliterated.
	(make_typename_type): Handle template classes correctly.

Index: testsuite/g++.old-deja/g++.pt/typename22.C
===================================================================
RCS file: typename22.C
diff -N typename22.C
--- /dev/null	Sat Dec  5 20:30:03 1998
+++ typename22.C	Fri Apr 16 17:53:38 1999
@@ -0,0 +1,17 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+template <class T>
+struct S {
+  template <class U>
+  struct I { 
+    typedef U X;
+
+    X f();
+  };
+};
+
+
+template <class T>
+template <class U>
+typename S<T>::I<U>::X S<T>::I<U>::f() {}
Index: cp/class.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/class.c,v
retrieving revision 1.148
diff -u -p -r1.148 class.c
--- class.c	1999/04/16 13:16:45	1.148
+++ class.c	1999/04/17 00:53:42
@@ -4160,7 +4160,6 @@ finish_struct (t, attributes, warn_anon)
      int warn_anon;
 {
   tree name = TYPE_NAME (t);
-  tree x;
 
   if (TREE_CODE (name) == TYPE_DECL)
     {
@@ -4481,8 +4480,6 @@ pushclass (type, modify)
 
   if (modify)
     {
-      tree tags;
-
       if (type != previous_class_type || current_class_depth > 1)
 	push_class_decls (type);
       else
@@ -4519,7 +4516,6 @@ pushclass (type, modify)
 void
 invalidate_class_lookup_cache ()
 {
-  tree tags = CLASSTYPE_TAGS (previous_class_type);
   tree t;
   
   /* This code can be seen as a cache miss.  When we've cached a
Index: cp/cp-tree.def
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/cp-tree.def,v
retrieving revision 1.26
diff -u -p -r1.26 cp-tree.def
--- cp-tree.def	1999/04/02 15:35:58	1.26
+++ cp-tree.def	1999/04/17 00:53:42
@@ -144,9 +144,11 @@ DEFTREECODE (TEMPLATE_TYPE_PARM, "templa
 DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0)
 
 /* A type designated by `typename T::t'.  TYPE_CONTEXT is `T',
-   TYPE_NAME is a TYPE_DECL for `t'.  If TREE_TYPE is present, this
-   type was generated by the implicit typename extension, and the
-   TREE_TYPE is a _TYPE from a baseclass of `T'.  */
+   TYPE_NAME is an IDENTIFIER_NODE for `t'.  If the type was named via
+   template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR.
+   If TREE_TYPE is present, this type was generated by the implicit
+   typename extension, and the TREE_TYPE is a _TYPE from a baseclass
+   of `T'.  */
 DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0)
 
 /* A type designated by `__typeof (expr)'.  TYPE_FIELDS is the
Index: cp/decl.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/decl.c,v
retrieving revision 1.346
diff -u -p -r1.346 decl.c
--- decl.c	1999/04/16 13:16:47	1.346
+++ decl.c	1999/04/17 00:53:51
@@ -5302,6 +5302,11 @@ build_typename_type (context, name, full
 			   &typename_compare))
     fatal ("virtual memory exhausted");
 
+  /* The FULLNAME needs to exist for the life of the hash table, i.e.,
+     for the entire compilation.  */
+  if (!TREE_PERMANENT (fullname))
+    fullname = copy_to_permanent (fullname);
+
   /* Build the TYPENAME_TYPE.  */
   t = make_lang_type (TYPENAME_TYPE);
   TYPE_CONTEXT (t) = FROB_CONTEXT (context);
@@ -5341,7 +5346,17 @@ make_typename_type (context, name)
   tree fullname;
 
   if (TREE_CODE_CLASS (TREE_CODE (name)) == 't')
-    name = TYPE_IDENTIFIER (name);
+    {
+      if (!(TYPE_LANG_SPECIFIC (name) 
+	    && (CLASSTYPE_IS_TEMPLATE (name) 
+		|| CLASSTYPE_USE_TEMPLATE (name))))
+	name = TYPE_IDENTIFIER (name);
+      else
+	/* Create a TEMPLATE_ID_EXPR for the type.  */
+	name = build_nt (TEMPLATE_ID_EXPR,
+			 CLASSTYPE_TI_TEMPLATE (name),
+			 CLASSTYPE_TI_ARGS (name));
+    }
   else if (TREE_CODE (name) == TYPE_DECL)
     name = DECL_NAME (name);
 


More information about the Gcc-patches mailing list